我浏览了React Native Headless JS的官方文档。在警告中,提到如果应用程序将尝试在前台运行任务,应用程序将崩溃。还提到有一种解决方法。请建议一种方式,以便我可以完成繁重的任务当应用程序位于前台时,使用Headless JS的UI线程以外的另一个线程。
答案 0 :(得分:3)
即使从当前活动的Activity启动,我也可以使用HeadlessJsTaskService
。你试过它而它崩溃了吗?
修改强>
我看了一下他们的实现。 您的应用会在以下情况下崩溃:
if (reactContext.getLifecycleState() == LifecycleState.RESUMED &&
!taskConfig.isAllowedInForeground()) { //crash }
(见ReactContext)
这意味着您可以使用HeadlessJsTaskConfig
HeadlessJsTaskService
为true
配置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线程中运行,因此执行昂贵的操作会降低用户体验。