私はライブ Android アプリケーションを持っており、マーケットから次のスタック トレースを受け取りました。これはアプリケーション コードで発生しているのではなく、アプリケーションからの何らかのイベントによって発生しているため、なぜ発生するのかわかりません (仮定)。
私はフラグメントを使用していませんが、それでも FragmentManager の参照があります。誰かがこの種の問題を回避するための隠れた事実を明らかにしてくれるなら:
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1109)
at android.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:399)
at android.app.Activity.onBackPressed(Activity.java:2066)
at android.app.Activity.onKeyDown(Activity.java:1962)
at android.view.KeyEvent.dispatch(KeyEvent.java:2482)
at android.app.Activity.dispatchKeyEvent(Activity.java:2274)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1668)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1720)
at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1258)
at android.app.Activity.dispatchKeyEvent(Activity.java:2269)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1668)
at android.view.ViewRoot.deliverKeyEventPostIme(ViewRoot.java:2851)
at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2824)
at android.view.ViewRoot.handleMessage(ViewRoot.java:2011)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:132)
at android.app.ActivityThread.main(ActivityThread.java:4025)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:491)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
at dalvik.system.NativeStart.main(Native Method)
ベストアンサー1
これは私がこれまでに遭遇した中で最も馬鹿げたバグです。API < 11でもAPI > 11でもFragment
完璧に動作するアプリケーションがありました。Force Closing
Activity
の呼び出しでライフサイクル内で何が変更されたのか本当にわかりませんでしたsaveInstance
が、次のように解決しました。
@Override
protected void onSaveInstanceState(Bundle outState) {
//No call for super(). Bug on API Level > 11.
}
電話をかけなくても.super()
、すべてうまくいきます。これで時間の節約になることを願っています。
編集:さらに調査したところ、これは既知のバグサポート パッケージに含まれています。
インスタンスを保存して何かを追加する必要がある場合は、outState
Bundle
以下を使用できます。
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putString("WORKAROUND_FOR_BUG_19917_KEY", "WORKAROUND_FOR_BUG_19917_VALUE");
super.onSaveInstanceState(outState);
}
編集2:Activity
バックグラウンドでトランザクションを実行しようとした場合にも、この問題が発生する可能性があります。これを回避するには、commitAllowingStateLoss()
編集3:上記の解決策は、私が覚えている限りでは、初期のsupport.v4ライブラリの問題を修正するものでした。しかし、それでも問題が解決しない場合は、必ず以下もお読みください。アレックス・ロックウッドのブログ:フラグメントトランザクションとアクティビティ状態の損失
ブログ投稿からの要約(ただし、ぜひ読んでみることをお勧めします):
- ハニカム前とハニカム
commit()
後の取引は絶対に行わないでくださいonPause()
onStop()
Activity
ライフサイクルメソッド内でトランザクションをコミットするときは注意してください。 、およびを使用してください。onCreate()
onResumeFragments()
onPostResume()
- 非同期コールバックメソッド内でトランザクションを実行しないようにする
commitAllowingStateLoss()
最後の手段としてのみ使用してください