Android App 記憶體泄露之Handler
Android App 記憶體泄露之Handler
Handler也是造成記憶體泄露的一個重要的源頭,主要Handler屬於TLS(Thread Local Storage)變數,生命週期和Activity是不一致的,Handler引用Activity會存在記憶體泄露。
看一下如下代碼
/** * * 實現的主要功能。 * @version 1.0.0 * @author Abay Zhuang
* Create at 2014-7-28 */public class HandlerActivity extends Activity { private final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { // ... } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mHandler.sendMessageDelayed(Message.obtain(), 60000); //just finish this activity finish(); }}
是否您以前也是這樣用的呢。
沒有問題?
Eclipse 工具有這樣的警告提示 警告:
This Handler class should be static or leaks might occur (com.example.ta.HandlerActivity.1)意思:class 使用靜態聲明否者可能出現記憶體泄露。
為啥出現這樣的問題呢Handler 的生命週期與Activity 不一致
- 當Android應用啟動的時候,會先建立一個UI主線程的Looper對象,Looper實現了一個簡單的訊息佇列,一個一個的處理裡面的Message對象。主線程Looper對象在整個應用生命週期中存在。
- 當在主線程中初始化Handler時,該Handler和Looper的訊息佇列關聯(沒有關聯會報錯的)。發送到訊息佇列的Message會引用發送該訊息的Handler對象,這樣系統可以調用 Handler#handleMessage(Message) 來分發處理該訊息。handler 引用 Activity 阻止了GC對Acivity的回收