2017-04-19 17 views
0

以下のコードはメモリリークの原因になりますか? 方法は、活動にAndroid Memory Leak - 匿名クラス

 public void main(){ 
     final Object obj = new Object(); 
     Runnable run = new Runnable() { 
      @Override 
      public void run() { 
       Thread.sleep(25000);//sleep 
       obj.hashCode();//do something 
      } 
     }; 
      new Thread(run).start(); 
    } 

であると仮定すると、このリードがリークしていますか?スレッドので、あなたがスレッドを作成するので、もし

おかげで ラム

+2

これはコンパイルされません...あなたはfinalに再度割り当てることができません(Runnable実装とmissigセミコロンのメソッドの欠如について言及していません) – Selvin

+0

なぜこれを行う必要がありますか?なぜそれをonDestroy()に入れないのですか – Sattar

+0

構文が間違っているのは残念です。バックグラウンドスレッドがまだアクティビティを待っていて、それがどうやって振る舞うのでしょうか? (私は、オブジェクトがクラスのメンバーである場合、アクティビティが確実に漏れていることを知っています) –

答えて

0

はい、スレッドは、アクティビティのライフサイクルに従わないとのRunnableが匿名クラスであることがあります、それの外部で作成されたオブジェクトを参照してください。 Javaは内部クラスを作成するため、アクティビティへの暗黙の参照

アクティビティの向きが変更されたり、他のタイプの設定が変更された場合、Androidはアクティビティを破棄して新しいものを作成しますが、スレッドはGCルーツとみなされるためガベージコレクタによって割り当てを解除できません。あなたのスレッドが終了するまで、メモリ内に2つのアクティビティを持つことになります。コンフィグレーションを変更する前にスレッドが終了しても問題ありませんが、通常は保証できないため、推奨されていません。

解決策は、内部静的クラスまたは外部クラスとして実行可能ファイルを宣言することです。構成変更によってスレッド/実行可能ファイル内のアクティビティへの参照が発生すると、新しいアクティビティの参照が渡されます。