この問題は、通常、アプリケーションのアーキテクチャの深刻な問題の症状です。ビュー・レイヤーとビジネス・ロジック・レイヤーの間に問題が適切に分離されていない場合は、それを見る傾向があります。
Activity/Fragmentで直接非同期作業を行っていて、その結果が返ってきたときにFragment Transactionを実行しようとしていると思います。
あなたはこの問題を解決するためにできることの数があります。
はフラグメント
フラグメントを使用する必要はほとんどないありません使用しないでください - 時間の90%はあなたをViewGroupを使用して同じ結果を達成し、すべてのライフサイクルの頭痛、ランダムクラッシュを避けることができます&そうでなければ不安定な動作フラグメントが原因です。
特定のライフサイクルコールバック(onActivityResult)が必要だった場合や、サードパーティのライブラリ(Android Pay、Braintree)に強制された場合にのみ、フラグメントを使用することができました。インタフェース
を経由してあなたのビュー
セパレートこれはMVP/MVVMパターンはすべてに約あるものを基本的にあります。あなたのビジネスロジック(Presenter/ViewModel)からビューを分離しています。
今 protected void onCreate(Bundle bundle) {
// ...
presenter.bind(this);
}
protected void onDestroy() {
// ...
presenter.unbind(this);
}
あなたのビジネスでは:あなたの活動は、それがプレゼンターに結合し、それが終了すると、それはアンバインド起動すると
public class MyActivity implements MyView { ...
:あなたの活動/フラグメントは、Viewインタフェースを実装しているためこれはあなたを助けるでしょうロジック非同期操作が終了し、ビューの更新が試行されます。アクティビティが終了すると、ビューはアンバウンドされます。それをヌルにするか、(好きなように)その場所にノーオペレーションビューを持たせることができます。
は、非同期操作
長期実行中の非同期プロセス(ネットワークまたは重い計算)の結果から直接、あなたのビューを更新しない可能性を実行するlongからあなたのビューを更新しないでください。代わりに、結果を永続レイヤーにキャッシュします(db/prefs/file)。あなたのビューは、永続層からのデータを購読してください。
サブスクリプションは、RxJava、イベントバス通知、スタティックコールバックなどのいくつかの方法で実行できます。
このようにして結果が戻ってくると、ただ保存されます。ビューがまだ有効な場合は、通知が取得され、永続性の結果がロードされます。そうでなければ、次回ロード時にそこからそれらを取り出すことができます。
最後に
はさておき、あなたではなく、単に.commit()
の.commitAllowingStateLoss()
を呼び出すことができ、それがクラッシュすることはありません。しかし、実際に根本的な問題を解決するものではありません。
「onSaveInstanceStateの後でこのアクションを実行できません。私がこれをやろうとすると、 – azizbekian
:fragmentTransaction.beginTransaction()。replace(R.id.my_frag_cont、fragment).commit(); – Alexei
この質問の回答をご覧ください。彼らは問題と可能な解決策について説明します。 http://stackoverflow.com/questions/7469082/getting-exception-illegalstateexception-can-not-perform-this-action-after-onsa – Juan