2

シナリオは次のとおりです。

  • アクティビティ「A」は、AsyncTask「T」を作成して実行します
  • 「T」がバックグラウンドで実行されているため、ユーザーは「A」から離れます。
    • ユーザーが「A」から離れる方法の例:
      • 「go」を押して、アクティビティ「B」を起動するインテントを開始します(私のアプリで最も一般的です)
      • 「戻る」ボタンを押す (私のアプリでもかなり一般的)
      • android:configChanges="orientation|keyboardHidden" なしで画面を回転させる
  • "T" は作業を終えて戻り、"A" の関数 "F" を呼び出して "A" の UI を更新しようとしましたが、"A" は... "なくなった" ?!

上記が「爆弾」にならないようにするにはどうすればよいですか?

4

2 に答える 2

1

Android 開発における非常に一般的なハードルです。私が最初にこの問題に遭遇したとき、私にとって物事を明らかにする多くの素晴らしい議論を含むこの Q を見つけました:

AsyncTask は本当に概念的に欠陥がありますか、それとも何か不足していますか?

AsyncTask の作成者は、孤立した完了が「安全」であることを確認するか、キャンセル/中止することが不可欠です。従来の知恵は、アクティビティの onPause または onDestroy 内から Task インスタンスをキャンセルする (または、@iagreen が提案するように、少なくとも独自のローリングのメカニズムを介して論理的に切り離す) ことです。

実行中の AsyncTask をキャンセルする理想的な方法

AsyncTask は、ライフサイクルが親アクティビティの「意図された」ライフサイクルと密接に一致する短い操作用であることを意図している Android チーム メンバーからの Web に関するガイダンスが頻繁にあります。明示的なスレッド管理やサービスのコーディングなどを見たいと思うかもしれません:

http://developer.android.com/reference/android/app/Service.html

于 2012-12-19T01:52:40.693 に答える
1

主な問題は、'AsyncTask's が通常、 の非静的内部クラスとして定義されていることActivityです。つまり、 への参照を保持していActivityます。あなたActivityが何らかの理由で破壊された、または破壊されて再作成された場合、あなたAsyncTaskはまだあなたの 'old' を参照していますActivity。そのアクティビティは UI に関連付けられていないため、UI コンポーネントを変更しようとすると、例外が発生します。

1 つのオプションは、onStop() でアクティビティのステータスを設定することです。プロセスが停止したかどうかを示すブール変数を使用します。UI を更新する前に確認してください。

于 2012-12-19T01:53:16.080 に答える