1

Javaでのメモリリークの基本的な概念を理解しています(つまり、不要なオブジェクトはまだ他のオブジェクトによって参照されており、GCできません)。Androidのウィンドウリーク中に内部的にはどうなりますか?

このコンセプトをAndroidのWindowLeaked例外にマップするにはどうすればよいですか? AsyncTask実行時に向きを変えるとき

はたとえば、次のコードは、WindowLeaked例外が発生します。この場合、オブジェクトがまだ保持しているものは不要なものを参照していますか? ProgressDialogまたはActivity

答えて

0
public class WindowLeakedTestActivity extends AppCompatActivity { 
    ... 
    static class MyTask extends AsyncTask<Void, Void, String> { 
     Context context; 
     private ProgressDialog mProgress; 

     public MyTask(Context c) { 
      context = c; 
     } 

     protected void onPreExecute() { 
      super.onPreExecute(); 
      mProgress = ProgressDialog.show(context, "hello world", "wait", true, true); 
     } 

     protected String doInBackground(Void... params) { 
      try { 
       Thread.sleep(8000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      return ""; 
     } 
    } 
} 

を破壊し、再度ロードするアン​​ドロイド原因活性の回転を変化させるためProgressDialogによって引き起こされるWindowLeaked。

したがって、アクティビティが破棄される前にmProgress.dismiss()に電話する必要があります。

+0

お返事ありがとうございます!なぜ 'アクティビティ 'が破壊されたときに' progressdialog'がリークするのか? – JackWM

+0

http://stackoverflow.com/a/21986772/966550 – waqaslam

+0

いいリンク。しかし、誰が「progressdialog」への参照を保持しているのかをGCedできないように答えることはできません。 – JackWM

0

使用しているコンテキストの種類(アクティビティまたはアプリケーション)が表示されませんでした。 主な問題はプログレスバーではなくコンテキストでもあります。静的クラスはアクティビティ呼び出し元より長く存続する可能性があり、静的クラスがコンテキストを保持していると、構成変更中にそのコンテキストの所有者が刈られるのを防ぎます。

Activity Lifecycleを考慮したAsyncTaskLoaderを使用できます。

関連する問題