gpt4 book ai didi

android - 在 React native Activity 的多个实例之间共享单个 ReactInstanceManager

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:21:55 25 4
gpt4 key购买 nike

我将 React Native 集成到原生 Android 应用程序中,并从原生代码创建了 React Native Activity 的新实例。

这是包装 ReactInstanceManager 类的代码:

public class ReactNativeInstanceWrapper
{

private static ReactNativeInstanceWrapper instance = new ReactNativeInstanceWrapper();

public static ReactNativeInstanceWrapper getInstance() {
return instance;
}

private ReactInstanceManager reactInstanceManager;

public ReactInstanceManager GetReactInstanceManager()
{
return reactInstanceManager;
}

public ReactInstanceManager Rebuild(Application application)
{
Boolean isDebugBuild = AppBuildType.IsBuildConfigDebug(application.getBaseContext());

reactInstanceManager = null;
synchronized (this) {
reactInstanceManager = ReactInstanceManager.builder()
.setApplication(application)
.setBundleAssetName("index.android.bundle")
.setJSMainModuleName("index.android")
.addPackage(new MainReactPackage())
.addPackage(new ReactIntegrationPackage())
.addPackage(new PickerPackage())
.addPackage(new LinearGradientPackage())
.setUseDeveloperSupport(isDebugBuild)
.setInitialLifecycleState(LifecycleState.BEFORE_CREATE)
.build();
}

if (!reactInstanceManager.hasStartedCreatingInitialContext())
{
reactInstanceManager.createReactContextInBackground();
}

return reactInstanceManager;
}

我想在应用程序加载和缓存它时解析一个 js 包,这使得 React Native 的加载速度更快。问题是在多个 Activity 之间共享 ReactInstanceManager 似乎会导致一些问题。

例如,在一种情况下,如果我在我的一个 Activity 中打开共享表然后返回到我的 RN Activity 并关闭它,我将无法在新的 RN Activity 中打开对话框。它抛出 WindowManager$BadTokenException,这可能意味着它试图将其附加到不存在的 Activity 。

在 RN Activity 中,这是我在 OnCreate 中创建 ReactRootView 的方式:

  this.ReactRootView = new ReactRootView(this);
setContentView(this.ReactRootView);

ReactNativeInstanceWrapper reactNativeInstanceWrapper = ReactNativeInstanceWrapper.getInstance();
this.ReactInstanceManager = reactNativeInstanceWrapper.GetReactInstanceManager();
if (this.ReactInstanceManager == null) {
this.ReactInstanceManager = ReactNativeInstanceWrapper.getInstance().Rebuild(getApplication());
}
this.ReactRootView.startReactApplication(this.ReactInstanceManager, reactNativeComponent, initialProps);

ReactInstanceManager 应该在 OnResume 中设置一个新 Activity :

  @Override
protected void onResume()
{
super.onResume();

if (this.ReactInstanceManager != null) {
this.ReactInstanceManager.onHostResume(this, this);
}
}

但看起来它仍然在某处保留对旧 Activity 的引用。

因此,我最终所做的是在每次离开 RN Activity 时销毁并重建 ReactInstanceManager 的实例。这不是一个完美的选择,但它确实有效。

我想找到一种方法来创建和保留 ReactInstanceManager 的单个实例,而不是每次都在后台重新创建它。

  • react-native-v: 0.42.3
  • 节点-v:v6.11.0
  • npm -v: 5.2.0
  • 平台:Android

最佳答案

这是我找到的解决方案。

我使用 MutableContextWrapper 来创建初始 ReactRootView。

ReactRootView reactRootView = new ReactRootView(new MutableContextWrapper(originActivity));

它允许我在 OnCreate 中用新上下文替换它

MutableContextWrapper contextWrapper = (MutableContextWrapper) reactRootView.getContext();
contextWrapper.setBaseContext(currentActivity);

这样我就可以预加载整个东西并在以后重用。我在一个 github 问题中偶然发现了这个解决方案。我希望有一个有据可查的方法来做到这一点。

在旧版本的 React Native 中,过去也存在对模态对话框的旧引用的问题,但现在已修复。

关于android - 在 React native Activity 的多个实例之间共享单个 ReactInstanceManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45355635/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com