android - 从 AsyncTask 调用时 startReactApplication 失败 - Android 中的 React Native

标签 android react-native

从神秘错误开始:java.lang.AssertionError: Attached DialogModule to host with pending alert but no FragmentManager (not attached to an Activity).

我在 MainActivity 中有这个:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    myManager = new MyManager(this);
    myManager.start();
}

public void onManagerReady() {
    mReactRootView = new ReactRootView(this);
    mReactInstanceManager = ReactInstanceManager.builder()
        .setApplication(getApplication())
        .setJSBundleFile("assets://index.js")
        .addPackage(new MainReactPackage())
        .setUseDeveloperSupport(BuildConfig.DEBUG)
        .setInitialLifecycleState(LifecycleState.RESUMED)
        .build();

    mReactRootView.startReactApplication(mReactInstanceManager, "MyReactCode");
    setContentView(mReactRootView);
}
...

onCreate 调用 onManagerReady 按预期工作。但是当我在管理器中使用 AsyncTask 时,它失败了:

public interface ManagerHandler { void onJobReady(); }

...

public class Manager implements ManagerHandler {
    public MyManager(Context context) {
        this.context = context;
    }
    public void start() {
        new AsyncJob(context, this).execute("");
    }

    @Override
    public void onJobReady() {
      ((MainActivity)context).onManagerReady();
    }

    private class AsyncJob extends AsyncTask<String, Void, String> {
      private final Context context;
      private final ManagerHandler handler;

      public AsyncJob(Context context, ManagerHandler handler) {
          this.context = context;
          this.handler = handler;
      }

      @Override
      protected void onPostExecute(String result) {
        handler.onJobReady();
      }
    ...
    }

我省略了一些 AsyncTask 样板 - 让我向您保证 AsyncTask 正在工作并且 onManagerReady() 在适当的时间被调用。 我也试过弄乱线程并“在 ui 线程上运行”,但没有成功。有趣的是,即使使用 Thread.sleep() 也会让 React 变得困惑,即使没有 AsyncTask 或从/到其他文件的调用也是如此。

最佳答案

可能为时已晚,无法为您提供帮助,但也许其他人会发现此答案有用。

基本上,您的 MainActivityReactActivity 的子类。您需要将其替换为您自己的类似于 ReactActivity 的类(只需复制粘贴)。将方法 onCreate(Bundle savedInstanceState) 的名称更改为其他名称,并在您的应用程序的其余部分准备好进行 react 时调用此方法。 您还需要更改 onResume(),以便仅在加载 react 时更改状态:

  @Override
  protected void onResume() {
    super.onResume();
    if (mReactInstanceManager != null) {
      mLifecycleState = LifecycleState.RESUMED;
      mReactInstanceManager.onResume(this, this);
    }
  }

在初始化 React 的方法末尾调用 onResume。

关于android - 从 AsyncTask 调用时 startReactApplication 失败 - Android 中的 React Native,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35712733/

相关文章:

java - Android Baseadapter 填充 ListView

react-native - 单击时如何在键盘上方设置文本输入? react 原生

Firebase:react-native:从 '@react-native-firebase/iid' 获取实例 id、iid 不起作用

react-native - react native 并需要 ('http' )

react-native - React Native 音频无法按时播放

java - LayoutInflater wordSpan

android - 在RecyclerView下方显示 View (不重叠)

android - 如何让我的通知执行 onclick 操作?

react-native - 更改设备字体时,应用程序字体会更改。如何限制?

android - ListView 未使用搜索 View 更新发布结果