在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; } } }