关于Android handler内存泄漏问题的测试与解决

来源:互联网 发布:淘宝网卖家首页 编辑:程序博客网 时间:2024/06/05 08:31

项目已经完工,今天无聊看看博客,关于handler内存泄漏的问题,突然想起来,个人项目中也大量用了handler,但是也没有发生内存泄漏。到底是什么问题,下面我来深究一下。

假如在一个activity中,我们使用了thread线程,10秒后来更新一个textview,代码如下:

public class TestBaseActivity extends BaseActivity {
private String TAG = TestBaseActivity.class.getName();
private TextView mytv;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "TestBaseActivity onCreate--");
setContentView(R.layout.activity_testbaseactivity);
mytv=(TextView)  findViewById(R.id.mytv);
new Thread(new MyThread()).start();
 
}

class MyThread implements Runnable{


@Override
public void run() {
try {
Thread.sleep(10*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Message msg = handler.obtainMessage();
msg.what = 1;
msg.obj = "hello";
handler.sendMessage(msg);
}

}

Handler handler=new Handler(){
public void handleMessage(android.os.Message msg) {
mytv.setText(msg.obj+"");
Log.e(TAG, msg.obj+"");
};
};


@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "TestBaseActivity onDestroy");

}
}

然后一打开activity,我就关掉了activity,查看log日志,activity销毁后,handler的log日志依然出现。刚开始以为是没有销毁handler造成,然后按照百度的方法,在onDestroy() 方法里面加上handler.removeCallbacksAndMessages(null);

@Override
protected void onDestroy() {

handler.removeCallbacksAndMessages(null);
super.onDestroy();
Log.d(TAG, "TestBaseActivity onDestroy");

}

又打开了activity,然后关掉activity,查看日志,10秒后是否有日志输出。发现依然有日志输出,难道是这个方法没有作用。

看了一下别人博客写的一般在handleMessage里面是给一个imageView设置图片。然后在子线程用了handler.sendMessageDelayed(msg,10*1000);来发送消息。

仔细思考了一下,发现原来是这样。在我的子线程里面,是延时了10秒后,再发的handler消息,而10秒中,handler消息是没有进入消息队列的,即使我的activity被销毁,子线程没有被销毁,10秒之后,消息依然会进入handler,系统的log日志依然会输出hello,于是该子线程变代码如下:

class MyThread implements Runnable{


@Override
public void run() {
Message msg = handler.obtainMessage();
msg.what = 1;
msg.obj = "hello";
// handler.sendMessage(msg);
handler.sendMessageDelayed(msg,10*1000);
}

}

再次测试onDestroy() 中调用handler.removeCallbacksAndMessages(null);是否remove了handler消息

测试查看log日志果然没有hello输出。一个小问题引发的一系列思考。

0 0
原创粉丝点击