React Native 0.64.2 如何让API队列调用函数在前后台持续运行
问题根因
React Native 0.64版本默认状态下,App切到后台后JS线程会被操作系统暂停调度,所有JS侧的循环、定时器、网络请求任务都会被挂起,所以你的for循环API队列才会停止执行。
可选解决方案
方案1:启用后台任务临时保活(适合队列总耗时<3分钟的场景)
iOS和Android系统都自带短时间的后台保活接口,适配0.64版本的实现逻辑如下:
- 首先引入
AppState监听应用前后台状态 - 当检测到App切后台时,调用后台任务申请接口:
- iOS端用系统自带的
UIBackgroundTaskIdentifier能力,Android端先申请android.permission.WAKE_LOCK权限 - RN侧可以直接用适配0.64版本的第三方库
react-native-background-task实现,代码示例:
import BackgroundTask from 'react-native-background-task' // 定义后台执行的任务逻辑 BackgroundTask.define(() => { // 把你的API队列执行逻辑放在这里 runApiQueue() // 所有任务执行完成后结束后台任务 BackgroundTask.finish() }) // 组件挂载时注册后台任务 useEffect(() => { BackgroundTask.schedule() return () => { // 手动停止时取消后台任务 BackgroundTask.cancel() } }, []) - iOS端用系统自带的
- 注意:这种方案系统默认给的后台运行时间iOS最多3分钟,Android最多10分钟,超出后任务还是会被系统挂起。
方案2:原生侧执行API队列(适合队列总耗时较长、需要确保必达的场景)
JS线程容易被挂起,最稳妥的方式是把API队列的执行逻辑移到原生线程:
- 在iOS/Android原生层写一个队列管理模块,通过Native Modules暴露给JS侧调用
- JS侧只需要把要请求的API参数批量传给原生模块,原生侧按照队列顺序依次发起请求,完全不受JS线程挂起的影响
- 任务完成后原生侧可以通过
RCTEventEmitter(iOS)/DeviceEventManager(Android)给JS发送通知,回调执行结果
额外注意事项
- 如果你的API请求需要携带用户认证信息,要确保原生侧可以拿到对应的Token,或者JS侧传参数的时候一起传递
- Android 12及以上版本需要额外申请
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS权限,避免系统电池优化杀死你的后台任务 - 队列执行要做好失败重试、断点续传的逻辑,避免App进程被系统杀死后任务全部丢失,你可以把待执行的API队列存在
AsyncStorage或者原生的持久化存储里,每次启动先读取未完成的任务继续执行
内容的提问来源于stack exchange,提问作者Tajinder Singh
相关产品推荐
相关产品推荐

