Activity中Handler潛在內存泄漏的問題

在activity的ui變更中,我們經常會使用到Handler來配合,但是這樣的做法有一個潛在的內存泄漏問題,因爲同一個線程下的handler共享一個looper對象,消息中保留了對handler的引用,只要有消息在隊列中,那麼handler便無法被回收,如果handler不是static那麼使用Handler的Service和Activity就也無法被回收。這就可能導致內存泄露。當然這通常不會發生,除非你發送了一個延時很長的消息。

在Android Studio中經過語法檢查一般會得到類似下面的一條警告
- this Handler class should be static or leaks might occur
官方的建議是把Handler改成靜態的,這樣就能避免無法回收的問題

static class ViewHandler extends Handler {   
  MainActivity mActivity;  
  public ViewHandler(MainActivity activity) {
       mActivity = new WeakReference<MainActivity >(activity).get();  
 }   
@Override   
public void handleMessage(Message msg) {
       switch (msg.what) { 
          case SET_TEXT:  
                  mActivity.runTime_edt.setText(String.valueOf(ConfigData.getRunTime()));   
            break;     
    ....UI操作 
     }  
 }

使用的時候

ViewHandler viewHandler = new ViewHandler(MainActivity .this);
viewHandler.sendEmptyMessage(SET_TEXT);
發佈了62 篇原創文章 · 獲贊 91 · 訪問量 46萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章