60

Android でこの単純な頻繁に発生する状況について質問があります。

main activity があり、AsyncTask が MainActivity のビューを更新できるように、mainactivity の参照とともに AsyncTask を呼び出します。

イベントをステップに分解します

  • MainActivity は AyncTask を作成し、その参照をそれに渡します。
  • AysncTask 、作業を開始し、たとえば 10 個のファイルをダウンロードします
  • ユーザーがデバイスの向きを変更しました。これにより、AsyncTask で孤立したポインターが発生します。
  • AsyncTask が完了し、ステータスを更新するためにアクティビティにアクセスしようとすると、null ポインタが原因でクラッシュします。

上記の解決策は、本「Pro Android 4」で推奨されているように、AsyncTask に WeakReference を保持することです。

WeakReference<Activity> weakActivity;

in method onPostExecute

Activity activity = weakActivity.get();
if (activity != null) {
   // do your stuff with activity here
}

これはどのように状況を解決しますか?

私の質問は、私の asynctask が 10 個のファイルをダウンロードしていて、5 個の完了時に (方向の変更により) アクティビティが再開された場合、FileDownloadingTask がもう一度呼び出されるのでしょうか?

最初に呼び出された前の AsyncTask はどうなりますか?

ありがとうございます。質問が長くなってしまい申し訳ありません。

4

3 に答える 3

7

WeakReferenceクラスは基本的に、JREが特定のインスタンスの参照カウンターを増やすのを防ぐだけです。

WeakReferenceJava のメモリ管理には触れず、あなたの質問に直接答えるつもりはありませんAsyncTask

向きを変更しても、 は自動的に再起動しませんAsyncTask。既知のメカニズム ( onCreate/ onDestroyonSave/RestoreInstanceState) を使用して、目的の動作をコーディングする必要があります。

元の に関してはAsyncTask、これらのオプションのどれが起こるか 100% 確信が持てません:

  • AsyncTaskそれへの参照を保持している唯一のオブジェクト (元のActivity) が破棄されるため、 Java はスレッドを停止してを破棄します。
  • または、一部の内部 Java オブジェクトがオブジェクトへの参照を維持し、AsyncTaskそのガベージ コレクションをブロックして、効果的に をAsyncTaskバックグラウンドで終了させます。

いずれにせよ、 をAsyncTask手動で中止/一時停止して再起動/再開する (または新しい に引き渡すActivity) か、代わりに a を使用することをお勧めしServiceます。

于 2013-08-18T20:50:45.423 に答える