我浏览了React Native Headless JS的官方文档。在注意事项中,提到如果应用程序尝试在前台运行任务,应用程序将崩溃。还有人提到,有一种方法可以解决这个问题。请建议一种方法,以便当应用程序处于前台时,我可以使用Headless JS在UI线程之外的另一个线程中完成繁重的任务。
即使从当前活动的"活动"启动,使用HeadlessJsTaskService
也很有效。你试过了吗,它坏了?
编辑
我看了一下它们的实施情况。您的应用程序将在以下情况下崩溃:
if (reactContext.getLifecycleState() == LifecycleState.RESUMED &&
!taskConfig.isAllowedInForeground()) { //crash }
(参见ReactContext)
这意味着您可以将HeadlessJsTaskService
中的HeadlessJsTaskConfig
配置为allowedInForeground
的true
。
例如
@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)