【问题标题】:java.lang.IllegalStateException crash reports from Google Play Console来自 Google Play 控制台的 java.lang.IllegalStateException 崩溃报告
【发布时间】:2018-08-25 07:44:08
【问题描述】:

我的 Android 应用出现问题。 一些使用 Android 7.1 或 8.0 的设备经常报告 IllegateStateException 崩溃。 我在谷歌上搜索并尝试修复它很多次但没有用。 我无法弄清楚导致这次崩溃的原因。 所以,如果你有时间,请帮助我。 这是一份完整的报告:

java.lang.IllegalStateException: 

  at android.support.v4.app.FragmentManagerImpl.addFragment (FragmentManagerImpl.java:60)

  at android.support.v4.app.BackStackRecord.executeOps (BackStackRecord.java:137)

  at android.support.v4.app.FragmentManagerImpl.executeOps (FragmentManagerImpl.java:38)

  at android.support.v4.app.FragmentManagerImpl.executeOpsTogether (FragmentManagerImpl.java:112)

  at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute (FragmentManagerImpl.java:89)

  at android.support.v4.app.FragmentManagerImpl.execPendingActions (FragmentManagerImpl.java:21)

  at android.support.v4.app.FragmentManagerImpl$1.run (FragmentManagerImpl.java:2)

  at android.os.Handler.handleCallback (Handler.java:869)

  at android.os.Handler.dispatchMessage (Handler.java:101)

  at android.os.Looper.loop (Looper.java:206)

  at android.app.ActivityThread.main (ActivityThread.java:6733)

  at java.lang.reflect.Method.invoke (Method.java)

  at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:240)

  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:845)

我有一个主要的活动包含一个 FrameLayout。 我使用这个 FrameLayout 来显示 5 个不同的片段:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
switch (button) {
    case 1:
        ft.replace(R.id.mainframe, fragment1, FRAGMENT1_TAG);
        break;
    case 2:
        ft.replace(R.id.mainframe, fragment2, FRAGMENT2_TAG);
        break;
    case 4:
        Fragment fragment4 = new Fragment();
        ft.replace(R.id.mainframe, fragment4, FRAGMENT4_TAG);
        break;
}
ft.setTransition(FragmentTransaction.TRANSIT_ENTER_MASK);
ft.commit();

有些片段必须保存以便以后恢复(片段 1 -> 3),有些必须刷新(创建新实例)(片段 4 -> 5)。 此外,在片段 4 和 5 上,有一个 viewpager 和一个按钮数组,用于在每个页面之间移动。浏览器代码:

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    viewPager.setAdapter(new FragmentPagerAdapter(getChildFragmentManager(), new Fragment[] {
            new Page1(),
            new Page2()
    }));
}

private void onButtonTap(Button btn) {
    switch (btn.getId()) {
        case R.id.button1:
            viewPager.setCurrentItem(0, true);
            break;
        case R.id.button2:
            viewPager.setCurrentItem(1, true);
            break;
    }
}

我还定义了 2 个从 Dialog 派生的类并使用 Toast。 我无法在模拟器或我的设备上重现。它只发生在少数设备上。 我的代码有什么问题吗? 请帮我。这个崩溃持续了很长时间,我需要摆脱它。 我期待着您的回音。 非常感谢。


编辑 1:这是我在片段 1 上调用 ft.replace 的地方

@Override
protected void onResume() {
    // Check server connection to go back to the first fragment
    if (!ConnectivityReceiver.getInstance().isServerConnected()) {
        Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.main_frame);
        if (currentFragment != null && 
            (FRAGMENT_4_TAG.equals(currentFragment.getTag()) || FRAGMENT_5_TAG.equals(currentFragment.getTag())) && isActive()) {
            .....
            ft.replace(fragment1);
        }
    }
}

【问题讨论】:

  • 如果 Google Play 开发者控制台将提供更有用的堆栈跟踪以及异常消息等,它会在此处显示 fragment already added
  • 这是我从 Google Play 开发控制台复制的完整报告。没有更多细节了。
  • 是的,我知道。 Google Play 不提供有用的崩溃报告是我更喜欢在生产应用中使用其他崩溃报告工具的原因。
  • 非常感谢您的建议。也许我也应该使用它。

标签: java android android-fragments fragment illegalstateexception


【解决方案1】:

根据源代码,如果您尝试添加已经是管理器成员的FragmentaddFragment 方法会抛出带有消息"Fragment already added" 的异常。

现在,我可以看到的FragmentManagerImpl 源代码版本与堆栈跟踪看起来有很大不同,所以这有点猜测。但我怀疑问题在于,当它们已经是布局的一部分时,您可能会在 fragment2fragment1 上调用 ft.replace。在某些情况下......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-25
    • 2017-11-02
    • 2019-03-18
    • 1970-01-01
    • 2018-07-24
    • 2017-10-23
    • 2019-04-01
    • 1970-01-01
    相关资源
    最近更新 更多