Android Handler应设为static
来源:互联网 发布:acl限制端口 编辑:程序博客网 时间:2024/04/28 09:57
android开发中,使用Lint检测时会提示这么一句话 : This Handler class should be static or leaks might occur。意为handler应用static修饰否则容易发生内存泄漏。
ADT20有这么一个变化:Look for handler leaks: This check makes sure that a handler inner class does not hold an implicit reference to its outer class。意为handler不应包括外部类的隐式引用。
扩展开来就是:同一个线程下的handler共享一个looper对象,消息中保留了对handler的引用,只要有消息在队列中,那么handler便无法被回收,如果handler不是static,那么使用Handler的Service和Activity就也无法被回收,即便它们的ondestroy方法被调用。这就可能导致内存泄露。当然这通常不会发生,除非你发送了一个延时很长的消息。
ADT20有这么一个变化:Look for handler leaks: This check makes sure that a handler inner class does not hold an implicit reference to its outer class。意为handler不应包括外部类的隐式引用。
扩展开来就是:同一个线程下的handler共享一个looper对象,消息中保留了对handler的引用,只要有消息在队列中,那么handler便无法被回收,如果handler不是static,那么使用Handler的Service和Activity就也无法被回收,即便它们的ondestroy方法被调用。这就可能导致内存泄露。当然这通常不会发生,除非你发送了一个延时很长的消息。
但把hanlder添加为static后,会发现在handler中调用外部类的方法和成员变量需要它们都定义为final,这显然是不大可能的。这里建议在你的Service或Activity中的增加一个内部static Handler类,这个内部类持有Service或Activity的弱引用,这样就可以解决final的问题。
static class IncomingHandler extends Handler { private final WeakReference<UDPListenerService> mService; IncomingHandler(UDPListenerService service) { mService = new WeakRference<UDPListenerService>(service); } @Override public void handleMessage(Message msg) { UDPListenerService service = mService.get(); if (service != null) { service.handleMessage(msg); } } }
static class MyHandler extends Handler { WeakReference<PopupActivity> mActivity; MyHandler(PopupActivity activity) { mActivity = new WeakReference<PopupActivity>(activity); } @Override public void handleMessage(Message msg) { PopupActivity theActivity = mActivity.get(); switch (msg.what) { case 0: theActivity.popPlay.setChecked(true); break; } } }; MyHandler ttsHandler = new MyHandler(this); private Cursor mCursor; private void test() { ttsHandler.sendEmptyMessage(0); } }
static class MHandler extends Handler { WeakReference<OuterClass> outerClass; MHandler(OuterClass activity) { outerClass = new WeakReference<OuterClass>(activity); } @Override public void handleMessage(android.os.Message msg) { OuterClass theClass = outerClass.get(); switch (msg.what) { case 0: { //使用theClass访问外部类成员和方法 break; } default: { Log.w(TAG, "未知的Handler Message:" + msg.what); } } } }
0 0
- android Handler应设为static
- Android Handler应设为static
- 用handler发延时消息时最好设置设为static
- android static Handler
- Android Handler : Handler为什么需要是static的 (一)
- Android Handler : Handler为什么需要是static的 (二)
- Static Handler
- Static Handler
- 把android 系统设为可写
- android static实现Service与Activity中Handler通信
- android static实现Service与Activity中Handler通信
- Android报警告:this handler class should be static...
- android static实现Service与Activity中Handler通信
- Android解惑之Handler为什么需要是static的
- Android解惑之Handler为什么需要是static的
- android 剪切图片并把背景色设为透明
- android默认将新安装的输入法设为可用
- Android 中ListView的边线设为虚线
- 【程序猿】2016年自己的十年计划篇
- 制作Android Demo GIF:程序演示效果GIF图录制
- 构造器和封装
- 一堆android面试题目--抄写
- ANR的分析和问题处理
- Android Handler应设为static
- 【Android】Android应用安装失败及无法打开
- Android中Bitmap,byte[],Drawable相互转化
- Android Camera原始帧格式转换 —— 获取Camera图像(一)
- Android ObjectAnimator动画初识、模仿
- Android直播必备之YUV使用总结 —— Android常用的几种格式:NV21/NV12/YV12/YUV420P的区别
- 读书 -- 《算法》总结
- 读书 -- 个人购书经验总结
- TortoiseSVN中分支和合并实践