onLoadFinishe 中的 illegalStateException
illegalStateException in onLoadFinishe
java.lang.IllegalStateException: Can not perform this action inside of
onLoadFinished
at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1886)
at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1905)
at android.app.BackStackRecord.commitInternal(BackStackRecord.java:688)
at android.app.BackStackRecord.commit(BackStackRecord.java:646)
at android.app.DialogFragment.dismissInternal(DialogFragment.java:312)
at android.app.DialogFragment.dismiss(DialogFragment.java:278)
为什么我的一些用户在 Play 商店控制台中遇到此崩溃。这不是设备或 OS 特定的。
我没有在 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);
}
在androidOSsource代码中:
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
尝试添加支票
isAdded()
在您的 handleMessage()
方法中,您的 handler
可能会在您的 Fragment
中。
如果您还有疑问,请告诉我
java.lang.IllegalStateException: Can not perform this action inside of onLoadFinished at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1886) at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1905) at android.app.BackStackRecord.commitInternal(BackStackRecord.java:688) at android.app.BackStackRecord.commit(BackStackRecord.java:646) at android.app.DialogFragment.dismissInternal(DialogFragment.java:312) at android.app.DialogFragment.dismiss(DialogFragment.java:278)
为什么我的一些用户在 Play 商店控制台中遇到此崩溃。这不是设备或 OS 特定的。
我没有在 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);
}
在androidOSsource代码中:
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
尝试添加支票
isAdded()
在您的 handleMessage()
方法中,您的 handler
可能会在您的 Fragment
中。
如果您还有疑问,请告诉我