我可以做些什么来使Headless JS服务在android中运行?

时间:2017-02-14 07:06:54

标签: react-native

我浏览了React Native Headless JS的官方文档。在警告中,提到如果应用程序将尝试在前台运行任务,应用程序将崩溃。还提到有一种解决方法。请建议一种方式,以便我可以完成繁重的任务当应用程序位于前台时,使用Headless JS的UI线程以外的另一个线程。

1 个答案:

答案 0 :(得分:3)

即使从当前活动的Activity启动,我也可以使用HeadlessJsTaskService。你试过它而它崩溃了吗?

修改

我看了一下他们的实现。 您的应用会在以下情况下崩溃:

if (reactContext.getLifecycleState() == LifecycleState.RESUMED &&
  !taskConfig.isAllowedInForeground()) { //crash }

(见ReactContext

这意味着您可以使用HeadlessJsTaskConfig HeadlessJsTaskServicetrue配置allowedInForeground

E.g。

@Override
@Nullable
protected HeadlessJsTaskConfig getTaskConfig(Intent intent) {
    Bundle extras = intent.getExtras();
    WritableMap data = extras != null ? Arguments.fromBundle(extras) : null;
    return new HeadlessJsTaskConfig(
            "FeatureExecutor",
            data,
            5000, 
            true /* Don't crash when running in foreground */);
}

但在我的测试用例中,即使显示ReactRootView,也不需要此步骤。我认为原因是,ReactRootView有自己的ReactContext(这可能不是一个好主意)。

对于您的实现,在使用Headless JS时应考虑以下事项:

  

allowedInForeground 是否允许此任务在应用程序位于前台时运行(即主机处于当前ReactContext的恢复模式)。如果你确实需要,只将其设置为true。请注意,任务在与UI代码相同的JS线程中运行,因此执行昂贵的操作会降低用户体验。

(见HeadlessJsTaskConfig.java