Android开发中,Handler是使用非常频繁的类。
一种使用Handler的方式,是在Activity或者Service中声明一个成员变量并直接初始化:
private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { // ... } };
这样的写法eclipse会给出一个leak的提示,以前一直没有太留意,在网上搜索之后,发现的确有可能出现内存泄漏的隐患,由于非静态内部类会持有外部类对象的引用,而Handler又由于Message处理的方式有可能常驻内存当中。这样就会导致外部的Activity或者Service在销毁之后无法及时被GC回收,甚至内存泄漏。
参考网上一些处理的方式,可以做出如下改动:
static class MsgHandler extends Handler { private WeakReference<Activity> mActivity; MsgHandler(Activity activity) { mActivity = new WeakReference<Activity>(activity); } @Override public void handleMessage(Message msg) { Activity activity = mActivity.get(); if (activity != null) { activity.handleMessage(msg); } } } private Handler mHandler = new MsgHandler(this);
由于静态内部类不能直接调用外部类对象(this)相关成员,加上WeakRefrence的机制,基本上可以避免出现泄漏的情况。:-)
相关推荐
In Android, Handler classes should be static or leaks might occur, Messages enqueued on the application thread’s MessageQueue also retain their target Handler. If the Handler is an inner class, its...
深入底层剖析,一个activity中多个handler和消息的处理过程,
使用Handler与多线程处理简单实例,能对Handler有更好的理解,代码剪短易懂。
NULL 博文链接:https://dingran.iteye.com/blog/1930178
深入底层剖析,一个activity中多个handler和消息的处理机制。
利用Handler和ArrayList来简单地处理并发事件,博客Demo
Handler一般处理程序实现实现文件无刷新上传
分享一份teamcenter流程设计常用handler处理程序的使用总结及参数设置示例,希望能帮到大家!
Android应用程序消息处理机制(Looper、Handler)分析
Class::ErrorHandler - 错误处理的基类 概要 package Foo; use base qw( Class::ErrorHandler ); sub class_method { my $class = shift; ... return $class->error("Help!") unless $continue; } sub object_...
比较了handler加thread 和 AsyncTask 在处理消息的不同,详见博客 http://blog.csdn.net/renlei0109/article/details/39524463
xamarin学习笔记A13(安卓Handler异步消息处理)Android中只能在主线程进行UI操作,不能在子线程操作,要根据子线程执行的结果来更新UI时,需要用到安卓异步消息处理机制。
Handler消息处理机制+面试说.md
通过 Foxit PDF Preview Handler 可以让你的OutLook2007预览PDF 文件。 Foxit PDF Preview Handler 1.1 For XP
js访问handler中任意方法; 访问一般处理程序;
一个简单的handler下载做耗时操作的demo
demo05: 通过handler.sendMessage和handleMessage发送处理消息 demo06: message传递bundle demo07: 加载一张网络图片 demo08: handler完成gridview的图文混排 demo09: 拦截消息,通过removeMessage() demo10: 拦截...
handler发送和接收message的各种方式 (1)Handler.SendEmptyMessage(what); (2)Handler.obtainMessage(int what, int arg1, int arg2, Object obj).sendYToTarget(); (3)Message.obtain(handler, MESSAGE_MSG, 0, 0, ...
android:handler简单用法
二是方便统一管理,通过Handler可以统一进行对UI的管理,因为Handler采用消息处理的机制。就是另一个线程发送一个编号给消息所在的线程,那么该线程的消息处理程序就会收到该消息并进行处理,而消息采用int类型,...