在Android開發中,經常使用Handler來進行主線程(UI線程)與子線程間的消息傳遞工作,代碼如下:
public class MyActivity extends Activity
{
Handler mHandler = new Handler()
{
@Override
public void handleMessage(Messagemsg)
{
super.handleMessage(msg);
{
};
}
但這麼做編譯器會報一個警告:This Handler class should be static or leaks might occur
意思是Handler應該創建成靜態的,並且使用弱引用,否則可能造成內存泄露。這是由於非靜態內部類會持有外部類對象的引用,而Handler又由於Message處理的方式有可能常駐內存當中。這樣就會導致外部的Activity或者Service在銷燬之後無法及時被GC回收,甚至內存泄漏。
解決辦法是將Handler聲明爲static嵌套類,並且使用對外部類的弱引用。在此,順便說一下什麼是弱引用:在垃圾回收器線程掃描它所管轄的內存區域的過程中,一旦發現了只具有弱引用的對象,不管當前內存空間足夠與否,都會回收它的內存。不過,由於垃圾回收器是一個優先級很低的線程,因此不一定會很快發現那些只具有弱引用的對象。弱引用常用來解決內存泄露問題。
代碼如下:
static class MyHandler extends Handler
{
WeakReference<MyActivity> mActivity;
MyHandler(MyActivity activity)
{
mActivity = new WeakReference<MyActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
MyActivity activity = mActivity.get();
switch (msg.what) {
case 0:
break;
}
}
}