【问题标题】:illegalStateException in onLoadFinisheonLoadFinishe 中的非法状态异常
【发布时间】:2022-01-08 17:51:39
【问题描述】:

java.lang.IllegalStateException: Can not perform this action inside onLoadFinished 在 android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1886) 在 android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1905) 在 android.app.BackStackRecord.commitInternal(BackStackRecord.java:688) 在 android.app.BackStackRecord.commit(BackStackRecord.java:646) 在 android.app.DialogFragment.dismissInternal(DialogFragment.java:312) 在 android.app.DialogFragment.dismiss(DialogFragment.java:278)

为什么我的一些用户在 Play 商店控制台中遇到此崩溃。这不是特定于设备或操作系统的。

我没有在 onLoadFinished 中进行任何与 UI 相关的事务。我正在执行 ABCAsyncTask,在它的 onPostExecute 中,我正在调用 pausehandler 来执行 UI。

另外,由于我使用了两个游标,所以这里调用了两次 onLoadFinished。

@Override
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
    if (cursor == null) {
        Log.e(LOG_TAG, "cursor is null");
        return;
    }


    (new ABCAsyncTask(this, cursorLoader, cursor)).execute();
}

ABCAsyncTask ->

 onPostExecute() {
    LoadItemPauseHandlerObject loadItemPauseHandlerObject = new LoadItemPauseHandlerObject ();
    Message responseMessage = new Message();
    responseMessage.what = 1; // some int
    responseMessage.obj = loadItemPauseHandlerObject;
    pauseHandler.sendMessage(responseMessage);
    }

在安卓操作系统source代码:

void callOnLoadFinished(Loader<Object> loader, Object data) {
if (mCallbacks != null) {
String lastBecause = null;
if (mHost != null) {
lastBecause = mHost.mFragmentManager.mNoTransactionsBecause;
                    mHost.mFragmentManager.mNoTransactionsBecause = "onLoadFinished";
}
try {
if (DEBUG) Log.v(TAG, "  onLoadFinished in " + loader + ": "
+ loader.dataToString(data));
                    mCallbacks.onLoadFinished(loader, data);
                } finally {
if (mHost != null) {
mHost.mFragmentManager.mNoTransactionsBecause = lastBecause;
}
}
mDeliveredData = true;
}
}

因为 finally {} 块将始终在主线程中的 try {} 块之后同步执行,并且在 onLoadFinished() 中我没有直接执行任何片段事务,所以,mNoTransactionsBecause 应该重置为lastBecause 那么为什么我的一些用户会出现这种崩溃?

我正在使用:

android.app.LoaderManager android.app.Activity android.app.Fragment

【问题讨论】:

  • 如果我的回答对你有帮助,请采纳:)

标签: java android android-asynctask fragment android-loadermanager


【解决方案1】:

尝试添加检查

isAdded()

在您的handlerhandleMessage() 方法中,它可能在您的Fragment 中。 如果您有进一步的疑问,请告诉我

【讨论】:

  • 你能解释一下,这个异常的根本原因是什么?
  • 是的,基本上你会收到handleMessage的事件,即使在片段被销毁之后你也会得到IllegalStateException。所以如果片段不存在,isAdded() 会给你 false。作为一种好的做法,您应该避免使用处理程序,因为 Android 中提供了 LiveData MVVM。
  • 顺便说一句,isAdded() 检查对您有帮助吗?
  • 我无法重现这一点。它发生在我的少数用户身上。上传apk后我会更新。
  • 当您认为您正在通过处理程序发送事件时,请尝试通过立即返回来重现此问题,无论是否有此修复,这样您就可以确定修复了
猜你喜欢
  • 2013-01-13
  • 2017-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多