1

基本的に正常に動作するフラグメントがあります。onResume メソッドでは、ユーザーがアクティビティ/フラグメントに到達するたびに、API 呼び出しを実行して新しいデータを取得します。

public void onResume(){
    super.onResume();

    //in pseudo
    do async call 
       success callback
          update ui

       failure callback
          update ui
}

ほとんどの場合、これで問題なく動作します。ただし、更新 ui メソッドが完了する前に、ユーザーが親アクティビティに戻ると問題が発生します。更新 UI は、いくつかのテキスト ビューを設定するだけです。

たとえば、ユーザーがアクティビティとフラグメントに移動すると、上記の onResume が呼び出されます。ユーザーはすぐに親アクティビティに戻ります。非同期呼び出しと更新 UI はまだ完了していません。次のようになります。

致命的な例外: メイン プロセス: com.project.foobar、PID: 4405 java.lang.IllegalStateException: フラグメント MyDetailFragment{41ebb478} がアクティビティに接続されていません

これは、成功コールバックの後に update ui メソッドでスローされます。Square のレトロフィットを使用して API 呼び出しを管理しています。繰り返しますが、これは UI の更新が完了していないときに発生します。終了するのを待って戻ると、すべて問題ありません。

何が間違っているのでしょうか?

4

2 に答える 2

6

isAdded()フラグメントから移動するときに非同期操作を中止するか、UI を更新しようとするときにフラグメントがまだアタッチされているかどうかを確認してください。添付されていない場合は、結果を無視してビューに触れないでください。

最初のオプションはおそらく最も正確ですが、実装が最も困難です。2 番目のオプションは、バックグラウンド スレッドで非常に負荷が高く長時間実行される処理を行っていない限り、私の意見ではまったく問題ありません。

于 2014-03-10T07:43:58.083 に答える
0

とにかく非同期タスクを終了させたい場合:onPostExecute受信したデータを保存し、リスナーを呼び出してビューを更新することを想像してください。より効率的にするために、とにかくタスクを終了させて​​、ユーザーが戻ったときにデータを準備できるようにします。この場合、私は通常これを行います:

@Override
protected void onPostExecute(void result) {
// do whatever you do to save data
  if (this.getView() != null) {
      // update views
  }
}

アクティビティにアタッチされていないフラグメント MyFragment

于 2014-03-10T08:21:02.447 に答える