2016-09-22 10 views
3

アンドロイドでメモリリークを防止しようとしています。私はいくつかのレガシーコードを継承し、それに開発者は、このような匿名の内部クラスとしてasyncTaskを作成している:私はデモできるようアンドロイド匿名asyncTask - メモリリークの原因になります

void startAsyncTask() { 
    new AsyncTask<Void, Void, Void>() { 
     @Override protected Void doInBackground(Void... params) { 
      while(true);//loop to keep thread alive forever. 
     } 
    }.execute(); 
} 

だから、僕は永遠に生きているスレッドの子供を保つために、この例では、ループを使用しています私のポイント。 私はstartAsyncTask()を呼び出すとアクティビティからメモリリークがありますか?クラスにはアクティビティ参照はありませんが、匿名クラスは実際には非静的な内部クラスであることに気付き、外部クラスへの参照を保持しています。それ自体がメモリリークであることは事実ですか?

+0

サービスを呼び出して、非同期タスクまたはスレッド – Kayra

答えて

4

タスクが終了するまで、外部クラス(アクティビティ)への参照が保持されます。そうすれば、活動は絶対に必要以上に長くなるでしょう。しかし、タスクが妥当な時間内に終了した場合は、タスクが終了してゴミ収集可能になり、Activityガベージを収集可能にします。より大きな懸念事項は、アクティビティの最後を過ぎても持続できる長期スレッド、または記述が不適切な場合はまったく終了しないスレッドです。

+0

を呼び出すことができます。私は誰もこの場合非静的な内部クラスを行う理由を知らない。漏れを避けるために、入れ子になった静的内部クラスに変換します。 – j2emanue

+0

静的でなければならないすべての内部クラスは本当にデフォルトにしておかなければなりません。静的でないという大きな理由は、内部クラスの親の変数/関数を参照する必要がある場合です。その場合は静的にすることはできません。 –

関連する問題