更新到adt2.0的开发者们可能会在handler上发现这么一条警告:This Handler class should be static or leaks might occur 。

   首先在ADT 20 Changes我们可以找到这样一个变化:New Lint Checks:

Look for handler leaks: This check makes sure that a handler inner class does not hold an implicit reference to its outer class.

翻译过来就是,Lint会增加一个检查项目即:确保class内部的handler不含有外部类的隐式引用 。

同一个线程下的handler共享一个looper对象,消息中保留了对handler的引用,只要有消息在队列中,那么handler便无法被回收,如果handler不是static那么使用Handler的Service和Activity就也无法被回收。这就可能导致内存泄露。当然这通常不会发生,除非你发送了一个延时很长的消息。

知道了原因我们在来看解决方法:
         1.最不想动代码的同学,可以在Preference搜一下Lint,在Lint Error Checking里搜HandlerLeak,然后选择ignore,然后整个世界清净了。。。。(不推荐)
         2.上面的方法虽然简单,但是肯定不好的。。。给这个检查肯定是有用的,那第二种方法,自然就是把Handler定义成static,然后用post方法把Runnable对象传送到主线程:例。
               

 private static Handler handler;

                public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); // Create a handler to update the UI
handler = new Handler();
} void test() {
handler.post(new MyRunnable());// 这样的方法同样可以用 SmsPopupActivity.this.runOnUiThread(new MyRunnalble());来替换,效果是一样的。
} static public class MyRunnable implements Runnable {
@Override
public void run() {
imageView.setImageBitmap(downloadBitmap);
dialog.dismiss();
}
}

3。看到这种方式可能又有很多人不乐意了,原来我一个handler处理多个消息,多舒服,你现在要我把每个消息都换成对应的Runnable对象发送,多不爽。
那我们可以通过弱引用的方式来做,例子如下示:我们首先定义了一个static的inner Class MyHandler然后让它持有Activity的弱引用。这样lint warning就消失了。

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);
}

转自eoe!

android之lint警告This Handler class should be static or leaks might occur的更多相关文章

  1. This Handler class should be static or leaks might occur,Handler和Context使用的注意事项!

    Android中.在使用到Handler的时候,假设按例如以下代码编写: private Handler handler; @Override public void onCreate(Bundle ...

  2. Android“This Handler class should be static or leaks might occur”警告的处理方法

    此文属于转载! 最近用到handle在线程中改变UI,会跟给出“This Handler class should be static or leaks might occur”的警告,网上看了很多解 ...

  3. Android - This Handler class should be static or leaks might occur.

    今天学习了使用 HTTP协议,从Android客户端往Tomcat服务器端以GET发送请求,途中无意中发现自己写的Handler类被Android提示:This Handler class shoul ...

  4. This Handler class should be static or leaks might occur Android

    首先解释下这句话This Handler class should be static or leaks might occur,大致意思就是说:Handler类应该定义成静态类,否则可能导致内存泄露 ...

  5. This Handler class should be static or leaks might occur(null) 解决办法 (转)

    原文链接:http://blog.csdn.net/wuleihenbang/article/details/17126371 首先解释下这句话This Handler class should be ...

  6. Handler classes should be static or leaks might occur

    http://droidyue.com/blog/2014/12/28/in-android-handler-classes-should-be-static-or-leaks-might-occur ...

  7. 85、android handler的警告Handler Class Should be Static or Leaks Occur

    转载:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1106/1922.html 在使用Handler更新UI的时候,我是这样写 ...

  8. Android下setLatestEventInfo警告、Handler警告、SimpleDateFormat警告

    正 文: 今天飘易在做Android 4.4.2下的APP开发时,使用了Notification下的setLatestEventInfo()方法时,Eclipse却提示:“ 不建议使用类型 Notif ...

  9. Android内存Context泄露:Handler&内部类

    1 public class SampleActivity extends Activity { 2 3 private final Handler mLeakyHandler = new Handl ...

随机推荐

  1. Intellij IDEA15: 带着参数 运行

    package main.scala /** * Created by silentwolf on 2016/5/24. */ object FileIO { def main(args: Array ...

  2. Polly公共处理 -重试(Retry)

    封装处理下Polly重试 private ILogger<PollyHelper> _logger; /// <summary> /// /// </summary> ...

  3. zabbix】问题 Time zone for PHP is not set (configuration parameterdate.timezone)

    https://blog.csdn.net/jing875480512/article/details/79002404

  4. 后缀自动机(SAM)速成手册!

    正好写这个博客和我的某个别的需求重合了...我就来讲一讲SAM啦qwq 后缀自动机,也就是SAM,是一种极其有用的处理字符串的数据结构,可以用于处理几乎任何有关于子串的问题,但以学起来异常困难著称(在 ...

  5. 【Java】 大话数据结构(18) 排序算法(5) (直接插入排序)

    本文根据<大话数据结构>一书,实现了Java版的直接插入排序. 更多:数据结构与算法合集 基本概念 直接插入排序思路:类似扑克牌的排序过程,从左到右依次遍历,如果遇到一个数小于前一个数,则 ...

  6. 了解java内存模型,看这里就够了

    转载请注明作者与出处 程序计数器 线程私有 因为物理cpu并不多,所以jvm是对java里面的线程进行不停的切换执行,因为切换的执行速度太快,所以我们看到是并发执行.所以jvm在切换线程执行后,如果要 ...

  7. oracle数据库连接错误解决办法

    ORA-28547 连接服务器失败,可能是Oracle Net 管理错误 原文地址:http://www.linuxidc.com/Linux/2014-11/109686.htm 上周去给客户培训O ...

  8. 电子邮件-TCP

    参考下图,由于电子邮件是最早应用于网络上的服务,而早期网络的不可靠性,才设计了TCP协议,而邮件必须要保证正确传输,而非高速,所以早期的电子邮件协议 全是基于TCP的,一直持续到现在.

  9. codevs 3022 西天收费站

    题目描述 Description 唐僧师徒四人终于发现西天就在眼前,但猴子突然发现前面有n个收费站(如来佛太可恶),在每个收费站用不同的方式要交的钱不同,输入每个收费站的每种方法收的钱,输出最少花的钱 ...

  10. 吴恩达-coursera-机器学习-week7

    十二.支持向量机(Support Vector Machines) 12.1 优化目标 12.2 大边界的直观理解 12.3 数学背后的大边界分类(选修) 12.4 核函数1 12.5 核函数2 12 ...