关于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输出。一个小问题引发的一系列思考。
- 关于Android handler内存泄漏问题的测试与解决
- Android handler的内存泄漏问题
- 关于Android中Handler引起内存泄漏问题
- 解决handler 可能发生的 内存泄漏的问题
- handler的内存泄漏问题
- Handler的内存泄漏问题
- Android 关于Handler内存泄漏的那些事
- Android webview内存泄漏问题的解决
- Android:关于ListView的内存泄漏问题
- 解决由Handler 引起的内存泄漏
- 解决由Handler引发的内存泄漏
- 关于handler的内存泄漏的总结
- Handler 内存泄漏问题
- 内存泄漏检测工具和Handler引起的内存泄漏问题
- Android Handler 内存泄漏
- Android Handler内存泄漏
- Android handler 引起的内存泄漏
- Android handler导致的内存泄漏
- Chapter 5 Neutron
- 57.The CUSTOMERS table has the following structure:
- java7新特性监听文件夹改变
- RegexKitLite
- Leetcode: Invert Binary Tree(JAVA)
- 关于Android handler内存泄漏问题的测试与解决
- HDMI之EDID使用说明
- Nginx是个啥?
- Chapter 6 创建云的入口
- springMVC + Mybatis +Mysql demo
- EXP/IMP迁移数据 导入导出全过程
- __stdcall,__cdecl,__fastcall的区别
- 如何防止客户端被破解
- c++中堆和栈的区别