报错语句:
......handler = new Handler()......
首先在ADT 20 Changes我们可以找到这样一个变化:New Lint Checks:
Look for handler leaks: This check makes sure that a handler inner class does not hold an implicit reference to its outer class.
翻译过来就是,Lint会增加一个检查项目即:确保class内部的handler不含有外部类的隐式引用 。
同一个线程下的handler共享一个looper对象,消息中保留了对handler的引用,只要有消息在队列中,那么handler便无法被回收,如果handler不是static那么使用Handler的Service和Activity就也无法被回收。这就可能导致内存泄露。当然这通常不会发生,除非你发送了一个延时很长的消息。
修改后代码:
static class THandler extends Handler {
WeakReference<MainActivity> tActivity;
public THandler(MainActivity a) {
tActivity = new WeakReference<MainActivity>(a);
}
}
class MessageThread implements Runnable{
@Override
public void run() {
Looper.prepare();
handler = new THandler(MainActivity.this){
@Override
public void handleMessage(Message msg) {
Log.d("MessageThread", Thread.currentThread().getName());
MainActivity ac = this.tActivity.get();
//ac.view();
String obj = (String)msg.obj;
Log.d("handleMessage", "传值:" + obj);
}
};
Looper.loop();
}
}
添加一个Handler的静态实现类,持有一个Activity的弱引用,使用SoftReference软引用也可以
参考资料:http://www.cnblogs.com/fanglove/archive/2013/03/08/2950102.html