こんにちは、私はこの問題に直面しています: Android アプリケーション (最小 SDK 2.1) でフラグメントを使用するために互換性パッケージを使用しています。
フラグメントでランダムな例外が発生することがありますが、その理由がわかりません。これは私が受け取るスタック トレースです:
java.lang.IllegalStateException: Fragment FeedListFragment{438a54e8} not attached to Activity
at android.support.v4.app.Fragment.getLoaderManager(Fragment.java:715)
at com.myappli.ui.FeedListFragment.refreshUpdateDate(FeedListFragment.java:283)
at com.myappli.ui.phone.FeedListActivity.onReceiveResult(FeedListActivity.java:277)
at com.myappli.data.rssplayer.service.KTDetachableResultReceiver.onReceiveResult(KTDetachableResultReceiver.java:55)
at android.os.ResultReceiver$MyRunnable.run(ResultReceiver.java:43)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:4425)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
at dalvik.system.NativeStart.main(Native Method)
Fragment クラスで呼び出している対応するコードは次のとおりです。
public class FeedListFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor>, FeedListCursorAdapterListener {
...
public void refreshUpdateDate() {
getLoaderManager().restartLoader(LAST_UPDATE_CURSOR_ID, null, this);
}
...
}
フラグメントを呼び出すアクティビティのコードは次のとおりです。
private FeedListFragment mCursorLoaderListFg;
if (!isFinishing()) {
mCursorLoaderListFg.refreshUpdateDate();
mCursorLoaderListFg.refreshDisplay();
mCursorLoaderListFg.hideLoadingArticles();
}
getLoaderManager() のフラグメント ソース コードは次のとおりです。
/**
* Return the LoaderManager for this fragment, creating it if needed.
*/
public LoaderManager getLoaderManager() {
if (mLoaderManager != null) {
return mLoaderManager;
}
if (mActivity == null) {
throw new IllegalStateException("Fragment " + this + " not attached to Activity");
}
mCheckedForLoaderManager = true;
mLoaderManager = mActivity.getLoaderManager(mIndex, mLoadersStarted, true);
return mLoaderManager;
}
クラッシュする前のアプリケーションの手順は次のとおりです。
- アクティビティはバックグラウンドでメソッドを呼び出します。
- アクティビティでコールバック メソッドが呼び出される
- このコールバック メソッドでは、アクティビティがフラグメントを呼び出します。
- フラグメントは、アクティビティが必要ないくつかのメソッド (getLoadManager() など) を起動しようとします。
- フラグメントはもうアクティビティに添付されていません => クラッシュ
2 つの修正を試みました。
- アクティビティをテストして、アクティビティが終了しているかどうかを確認します (上記のコードのように)
- メソッド isDetached を使用してフラグメントをテストします。
ご協力いただきありがとうございます!!!
よくわからない場合は、お気軽にお問い合わせください。