java.lang.IllegalStateException:Android 中没有 (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) 崩溃的实例化片段

问题描述 投票:0回答:1

我的 Android 日志中很少会出现这样的堆栈跟踪崩溃:

java.lang.IllegalStateException: No instantiated fragment for (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3644)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3781)
at android.app.ActivityThread.handleRelaunchActivityInner(ActivityThread.java:5782)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:5673)
at android.app.servertransaction.ActivityRelaunchItem.execute(ActivityRelaunchItem.java:71)
at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:138)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2306)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7918)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)

Caused by: java.lang.IllegalStateException: No instantiated fragment for (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
at androidx.fragment.app.FragmentStore.restoreAddedFragments(FragmentStore.java:62)
at androidx.fragment.app.FragmentManager.restoreSaveStateInternal(FragmentManager.java:2602)
at androidx.fragment.app.FragmentManager.attachController(FragmentManager.java:2722)
at androidx.fragment.app.FragmentController.attachHost(FragmentController.java:117)
at androidx.fragment.app.FragmentActivity.lambda$init$3$androidx-fragment-app-FragmentActivity(FragmentActivity.java:139)
at androidx.fragment.app.FragmentActivity$$ExternalSyntheticLambda3.onContextAvailable(Unknown Source:2)
at androidx.activity.contextaware.ContextAwareHelper.dispatchOnContextAvailable(ContextAwareHelper.kt:84)
at androidx.activity.ComponentActivity.onCreate(ComponentActivity.java:377)
at androidx.fragment.app.FragmentActivity.onCreate(FragmentActivity.java:216)
at com.xxx.xxx.MyActivity.onCreate(MyActivity.java:31)
at android.app.Activity.performCreate(Activity.java:8342)
at android.app.Activity.performCreate(Activity.java:8321)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1417)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3625)

注意,我将日志中的片段 ID 替换为所有 X,但它是一些随机 UUID,例如 8a5ae1d0-23db-489c-94de-5b1f4d641685。 是什么导致了崩溃?

android android-fragments android-lifecycle fragmentmanager
1个回答
0
投票

在我的例子中,这是由于当状态已保存并且片段之一是保留片段时对活动的已保存片段状态的干扰造成的。我不知道如果没有在某处保留碎片,它会如何发生,但我在网上看到了建议,它可以。

我的情况是这样的:Activity A 添加了一个正在运行 AsyncTask 的保留片段。我转到 Activity B 并保存活动状态,包括保留的片段。在 AsyncTask 的 onPostExecute 中,我引用了 Activity A,并从 FragmentManager 中删除了保留的片段(是的,这并不常见)。在活动 B 中,我旋转手机并返回到活动 A,它尝试从引用已删除保留片段的保存状态重新创建,并且出现“无实例化片段”崩溃。

如果不保留片段,则不会发生这种情况,因为 Android 无论如何都会在活动轮换时重新创建片段。

这是一个自我回答的问题,因为我在研究这个错误时在网上发现的很少。我的崩溃发生在 androidx 片段库 1.6.0 中。我的修复方法是仅当 Activity A 至少处于“RESUMED”状态时才删除保留的片段。它适用于我的情况,但如果您因为在 Play Console 日志中看到它而在 Google 上搜索它,那么您可能会因为不同的原因而得到它。请在下面评论并详细说明。

© www.soinside.com 2019 - 2024. All rights reserved.