在Android开发过程中使用Handler 经常会看到如下提示:
”This Handler class should be static or leaks might occur“
这个警告是什么意思呢??
同一个线程中的Handler对象共享同一个用于读写消息的Looper对象,由于message 包含目标Handler,只要该message 一直在消息队列,目标Handler就无法被GC回收。
如果Handler不是静态对象,包含该Handler的activity 或者service 即使被结束,仍然无法被回收(garbage collected)。
如果message一直在消息队列中,这种情况有可能会导致内存泄露(memory leaks)。
这种情况什么时候回出现呢?例如在你post一个长时间delay 的message,这样就有可能会出现service已经结束,但是message还在队列中。
因此,我们可以采用静态类和弱引用的方法来处理这个问题。例子参考如下:
static class IncomingHandler extends Handler {
private final WeakReference<UDPListenerService> mService;
IncomingHandler(UDPListenerService service) {
mService = new WeakReference<UDPListenerService>(service);
}
@Override
public void handleMessage(Message msg)
{
UDPListenerService service = mService.get();
if (service != null) {
service.handleMessage(msg);
}
}
}
public class MyGridFragment extends Fragment{
static class MyInnerHandler extends Handler{
WeakReference<MyGridFragment> mFrag;
MyInnerHandler(MyGridFragment aFragment) {
mFrag = new WeakReference<MyGridFragment>(aFragment);
}
@Override
public void handleMessage(Message message) {
MyGridFragment theFrag = mFrag.get();
switch (message.what) {
case 2:
ArrayList<HashMap<String,String>> theurls = (ArrayList<HashMap<String,String>>) message.obj;
theFrag.urls.addAll(theurls);
theFrag.theimageAdapter.notifyDataSetChanged();
theFrag.dismissBusyDialog();
break;
}//end switch
}
}
MyInnerHandler myHandler = new MyInnerHandler(this);
}
参考地址:This Handler class should be static or leaks might occur: IncomingHandler