使用 Headless JS 进行本机反应的后台/前台服务
Posted
技术标签:
【中文标题】使用 Headless JS 进行本机反应的后台/前台服务【英文标题】:Background/Foreground service in react native using Headless JS 【发布时间】:2019-04-27 23:42:58 【问题描述】:我在 react native 中使用 Headless JS
创建后台服务。我的要求是创建一个服务,该服务将从MainActivity
调用(例如单击按钮)并在应用程序进入后台后继续执行。我可以设法使用Headless JS
创建服务并在按钮单击时调用。为简单起见,我将用简单的代码进行解释
MyTask.js
module.exports = async () =>
console.log("I am called from java service");
for(var i=0; i<1000000;i++)
console.log("I am called from for loop"+i);
;
使用上述代码时,即使应用程序进入后台,for 循环也会继续执行,直到 i
到达 999999
我也能够在控制台中看到日志消息。
但我的实际任务包含一些async
函数。例如,当我在任务中使用以下代码时,应用程序进入后台时无法打印
module.exports = async () =>
console.log("I am called from java service");
setInterval(() =>
console.log("I am called from java service inside setInterval");
, 100);
;
上面的代码应该以100
ms 的间隔连续打印日志消息。但是,当应用程序进入后台时,它会停止打印。当应用程序恢复时,它再次开始打印。
有人可以帮忙吗?
【问题讨论】:
【参考方案1】:我的猜测是,一旦你的异步无头任务结束(从调用者的角度),你的活动就会暂停,这是what RN documentation suggests:
您可以在任务中执行任何操作,例如网络请求、计时器和 依此类推,只要它不触及 UI。一旦你的任务完成(即 承诺已解决),React Native 将进入“暂停”模式 (除非有其他任务正在运行,或者有前台应用程序)。
虽然不清楚,但您可能认为 JS 计时器(例如 setInterval
)会让您的代码保持运行……但不会。
RN doc 所暗示的解决方案是实现一个原生服务 - 例如一个原生计时器而不是一个 JS 计时器 - 这基本上是 react-native-background-timer 所做的......
编辑
关于前台执行,默认情况下,headlessJS 任务是不允许在前台执行的,会报错。
【讨论】:
由于实际的服务代码中包含了一系列async
的方法和事件,所以无法将其转化为同步的。它也是一个在 webrtc 之上创建的自定义 js 库,用于与另一台设备进行通信。原生实现也很难实现。您还有其他可以提供帮助的建议/解决方案吗?
纯 JS 中的 Webrtc 可能无法正常工作......或者你正在使用这个:github.com/oney/react-native-webrtc?尽管如此,如果没有进一步的上下文,很难为您提供帮助:您如何设置无头任务,您如何称呼它...以上是关于使用 Headless JS 进行本机反应的后台/前台服务的主要内容,如果未能解决你的问题,请参考以下文章
当应用程序处于后台时,在反应本机后台计时器 setInterval 中调用 await