2017-04-19 15 views
0

下面的代碼會導致內存泄漏嗎? 假設該方法處於活動狀態Android內存泄露 - 匿名類

 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

這甚至不會編譯......你不能再次分配給最終的(不提及Runnable實現中缺少方法和錯誤分號) – Selvin

+0

爲什麼你必須這樣做?爲什麼不把它放在onDestroy() – Sattar

+0

對不正確的語法。如果後臺線程在活動破壞後仍然在等待,現在它的行爲如何。 (我知道如果Object是類的成員,那麼活動肯定會泄漏) –

回答

0

是的,線程不遵循活動的生命週期,因此,如果您創建一個線程和了Runnable是一個匿名類將有一個隱式引用該Activity,因爲Java將創建一個內部類。

如果活動方向更改或任何其他類型的配置更改,Android將銷燬該活動並創建一個新的活動,但由於線程被視爲GC根,因此無法由垃圾收集器解除分配,淨效應是在線程結束之前,你將在內存中進行2個活動。如果你的線程在配置更改之前結束,那麼你確定,但這不是建議的做法,因爲你通常不能保證。

一種解決方案是將可運行內容聲明爲內部靜態類或外部類,並且當配置更改發生時,您對Thread/Runnable中的活動的任何引用都會傳遞新活動的引用。