【Android】[转] Android Handler应设为static
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方法被调用。这就可能导致内存泄露。当然这通常不会发生,除非你发送了一个延时很长的消息。
但把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);
}
}
}
}
【Android】[转] Android Handler应设为static的更多相关文章
- Android - This Handler class should be static or leaks might occur.
今天学习了使用 HTTP协议,从Android客户端往Tomcat服务器端以GET发送请求,途中无意中发现自己写的Handler类被Android提示:This Handler class shoul ...
- This Handler class should be static or leaks might occur Android
首先解释下这句话This Handler class should be static or leaks might occur,大致意思就是说:Handler类应该定义成静态类,否则可能导致内存泄露 ...
- 85、android handler的警告Handler Class Should be Static or Leaks Occur
转载:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1106/1922.html 在使用Handler更新UI的时候,我是这样写 ...
- Android“This Handler class should be static or leaks might occur”警告的处理方法
此文属于转载! 最近用到handle在线程中改变UI,会跟给出“This Handler class should be static or leaks might occur”的警告,网上看了很多解 ...
- android之lint警告This Handler class should be static or leaks might occur
更新到adt2.0的开发者们可能会在handler上发现这么一条警告:This Handler class should be static or leaks might occur . 首先在ADT ...
- 深入探索Android中的Handler
一.概述 1. 什么是Handler Handler是Android消息机制的上层接口,它为我们封装了许多底层的细节,让我们能够很方便的使用底层的消息机制.Handler的最常见应用场景之一便是通过H ...
- Android中由Handler和内部类引起的内存泄漏
原文地址:http://johnnyshieh.github.io/android/2015/09/03/android-handler-memory-leak/ 在Android中我们经常用Hand ...
- Android中使用Handler造成内存泄露的分析和解决
什么是内存泄露?Java使用有向图机制,通过GC自动检查内存中的对象(什么时候检查由虚拟机决定),如果GC发现一个或一组对象为不可到达状态,则将该对象从内存中回收.也就是说,一个对象不被任何引用所指向 ...
- (转)Android消息处理机制(Handler、Looper、MessageQueue与Message)
转自 http://www.cnblogs.com/angeldevil/p/3340644.html Android消息处理机制(Handler.Looper.MessageQueue与Messag ...
随机推荐
- Vagrant 启用 rsync
折腾了那么久,发现这些smb,nfs,virtualcfs,这些同步方案在windows下都不是最完美的.最完美的还是 rsync,我使用它同步windows上的代码,在windows浏览器中打开虚拟 ...
- Kernels
Let \(E\) be a set and \(\mathscr{E}\) a \(\sigma\)-algebra of subsets of \(E\). Assume that the ...
- sphinx教程
http://www.php100.com/html/it/focus/2013/0916/6188.html### 以上一篇的email数据表为例: 数据结构: 01.CREATE TABLE em ...
- Excel VBA自定义函数编写(UDF, User-Defined Function)
虽然知道Microsoft Office Excel可以支持用VB语言来进行复杂的编程和自定义函数的编写,但是一直以来都没有这个需求. 这次遇到的问题是要根据一列数组计算出一个值,但计算过程又比较复杂 ...
- PAT/简单模拟习题集(一)
B1001.害死人不偿命的(3n+1)猜想 (15) Description: 卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把(3n+1)砍掉 ...
- Coding Kata - 挑战你的“底线”
Coding Kata简介 如何进行Kata练习 亲身感受 Coding Kata简介 前段时间听到一个比较有意思的概念叫做Coding Kata,今天试了一下来说说一些想法和思考.Kata是一个日语 ...
- CSS折行小记
最近项目中遇到字段内容过长的显示问题. 后来在网上找了资料,http://www.php100.com/html/webkaifa/DIV_CSS/2009/0416/2453.html 用了td( ...
- CocoaPods 使用
为什么要使用这个玩意呢,最近在使用swift开发项目,使用 swift 开源库的时候,在git上下载后居然不知道哪些是必须文件,还要思考下,看看哪些是需要的(不像原来oc开源库,一目了然),网上使用d ...
- Java基础之泛型
泛型: (1)为什么会出现泛型? 因为集合存放的数据类型不固定,故往集合里面存放元素时,存在安全隐患, 如果在定义集合时,可以想定义数组一样指定数据类型,那么就可以解决该类安全问题. JDK1.5后出 ...
- Node.js入门:文件查找机制
文件查找流程图 从文件模块缓存中加载 尽管原生模块与文件模块的优先级不同,但是都不会优先于从文件模块的缓存中加载已经存在的模块. 从原生模块加载 原生模块的优先级仅次于文件模块缓存的优 ...