2011-08-25 34 views
2

這種代碼會導致Android內存泄漏嗎?使用處理程序可能的內存泄漏?

class MyActivity extends Activity { 

    Runnable myRunnable =new Runnable() { 
     public void run() { 
      // Do something here 
     } 
    }; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.my_activity); 
     Handler = new Handler(); 
     Handler.postDelayed(myRunnable, 2000); 
    } 
} 

在上面的代碼,myRunnable具有較強的參考MyActivity,並加入myRunnable到線程消息隊列。當MyActivity關閉時,MyActivity實例仍然被全局消息隊列強引用,因此可能存在內存泄漏。

我理解它嗎?

回答

1

我認爲沒有內存泄漏。 Runnable將在2秒內被調用,此消息將從MessageQueue中刪除。

+0

是否有可運行的卡在消息隊列中的任何可能性? – Kai

+0

我覺得沒有。看看'Looper.loop()'和'MessageQueue.next()'的實現。 – Michael

0

實際上,消息可能會卡在隊列中。

如果您的MyRunnable中有一個長時間運行的操作,將會有activity.finish()系統將沒有時間從隊列中刪除您的消息,並且它會在您下次運行時執行(假設完成()未完全關閉您的應用程序)

作爲一個很好的做法,以避免內存泄漏嘗試進行內部類的靜態