2017-03-18 10 views
0

私は10の活動をしています。また、私は20の断片を持っています。修正する最良の方法:onSaveInstanceStateの後にこのアクションを実行できませんか?

いずれもUIで動作します。その後、呼び出されるメソッドonSaveInstanceState(後のUI(例えば後にアプリケーションを最小化する))との仕事は例外をスローした場合:は、私はすべてのフラグメントおよび活動にご確認このアプリケーションは可視性(あるさを修正するにはonSaveInstanceState

後にこのアクションを実行することはできません私はこのためにカスタムmehtodを書く)。結果が真である場合は、UIで作業を開始してください。

これで問題は解決しました。しかし、私はこれが最高の解決策ではないと思います。

この問題を解決するための他の解決策はありますか?

P.S.論理が重複するため、rootのframgentおよびrootのアクティビティは適切な解決策ではありません。

+0

「onSaveInstanceStateの後でこのアクションを実行できません。私がこれをやろうとすると、 – azizbekian

+0

:fragmentTransaction.beginTransaction()。replace(R.id.my_frag_cont、fragment).commit(); – Alexei

+0

この質問の回答をご覧ください。彼らは問題と可能な解決策について説明します。 http://stackoverflow.com/questions/7469082/getting-exception-illegalstateexception-can-not-perform-this-action-after-onsa – Juan

答えて

0

この問題は、通常、アプリケーションのアーキテクチャの深刻な問題の症状です。ビュー・レイヤーとビジネス・ロジック・レイヤーの間に問題が適切に分離されていない場合は、それを見る傾向があります。

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()を呼び出すことができ、それがクラッシュすることはありません。しかし、実際に根本的な問題を解決するものではありません。

関連する問題