此文属于转载!

最近用到handle在线程中改变UI,会跟给出“This Handler class should be static or leaks might occur”的警告,网上看了很多解决办法,但都不够详细,这里我重新写一下这个问题的解决办法。

1.问题原因:在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.” 就是说在ADT20以后加入了一条新的检查规则:确保类内部的handler不含有对外部类的隐式引用 。

2.解决办法:我这里提供三种解决办法推荐第三种。

第一种:(不推荐)根据eclipse的提示,直接加入
“@SuppressLint("HandlerLeak")”的注释或者在
Window-->Preferences-->Android-->Lint Error
Checking里面检索HandlerLeak,然后选择ignore。如下图:

不推荐 这种方法,这种方法实际上没有解决问题。

第二种 :把Handler定义成static,然后用post方法把Runnable对象传送到主线程,代码如下:

  1. private static Handler handler;
  2. private TextView textView;
  3. public void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.main);
  6. handler = new Handler(); // Create a handler to update the UI
  7. }
  8. void test() {
  9. handler.post(new MyRunnable());
  10. }
  11. static public class MyRunnable implements Runnable {
  12. @Override
  13. public void run() {
  14. textView.setText(R.string.success);//改变textView显示的内容
  15. /*此处放入要改变UI的操作即可*/
  16. }
  17. }

这种方法将要发送的消息转换成了对应的Runable对象,适用于只有一个消息要发送的情形,如果有多个消息要发送可以采用第三种方法。

第三种 :(推荐)这里我们可以采用弱引用的方式来解决问题,我们先定义一个static的内部类MyHandler,然后让它持有Activity的弱引用,这样问题就得到了解决。代码如下:

  1. static class MyHandler extends Handler {
  2. //注意下面的“PopupActivity”类是MyHandler类所在的外部类,即所在的activity
  3. WeakReference<PopupActivity> mActivity;
  4. MyHandler(PopupActivity activity) {
  5. mActivity = new WeakReference<PopupActivity>(activity);
  6. }
  7. @Override
  8. public void handleMessage(Message msg) {
  9. PopupActivity theActivity = mActivity.get();
  10. switch (msg.what) {
  11. //此处可以根据what的值处理多条信息
  12. case 0x0001:
  13. //这里可以改变activity中的UI控件的状态
  14. theActivity.textView.setText(R.string.hello_world);
  15. break;
  16. }
  17. case 0x0002:
  18. //这里可以改变activity中的UI控件的状态
  19. theActivity.textView.setText(R.string.welcome);
  20. break;
  21. /*这里可以有多条要处理信息的操作*/
  22. /*... ...*/
  23. }
  24. }
  25. };
  26. //实例化一个MyHandler对象
  27. MyHandler testHandler = new MyHandler(this);
  28. private void test1() {
  29. //这里发送了一个空消息,空消息的what值是0x0001
  30. testHandler.sendEmptyMessage(0x0001);
  31. }
  32. private void test2() {
  33. //这里发送了一个空消息,空消息的what值是0x0001
  34. testHandler.sendEmptyMessage(0x0002);
  35. }

如果您有更好的解决方案,欢迎留言,参考文献:http://stackoverflow.com/questions/11407943/this-handler-class-should-be-static-or-leaks-might-occur-incominghandler

Android“This Handler class should be static or leaks might occur”警告的处理方法的更多相关文章

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

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

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

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

  3. 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 ...

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

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

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

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

  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】[转] Android Handler应设为static

    android开发中,使用Lint检测时会提示这么一句话 : This Handler class should be static or leaks might occur.意为handler应用s ...

  9. Android Weak Handler:可以避免内存泄漏的Handler库

    这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识.前端.后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过! android使用java作 ...

随机推荐

  1. Java API —— 反射

    1.类加载器     1)类的加载         · 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化.         · 加载 :就是 ...

  2. libXml ARC forbids explicit message send of'release'

    'release' is unavailable: not available in automatic reference counting mode ARC forbids explicit me ...

  3. Objective-C命名编写规范

    There are only two hard things in Computer Science: cache invalidation and naming things. 在计算机科学中只有两 ...

  4. [HDOJ2586]How far away?(最近公共祖先, 离线tarjan, 并查集)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 这题以前做过…现在用tarjan搞一发…竟然比以前暴力过的慢………… 由于是离线算法,需要Que ...

  5. chrome浏览器无法设置打开特定网页

    最近chrome浏览器更新后,发现以前设置的启动浏览器“重上次停下的地方继续”功能消失了. 当我点击设置网页时,会出现如上提示. 后来有同事给了如下一个连接,里面说到这个是公司的超级管理员搞的,他定义 ...

  6. 一个java高级工程师的进阶之路

    宏观方面 一. JAVA.要想成为JAVA(高级)工程师肯定要学习JAVA.一般的程序员或许只需知道一些JAVA的语法结构就可以应付了.但要成为JAVA(高级) 工程师,您要对JAVA做比较深入的研究 ...

  7. python - pip 从已有的安装列表 安装

    已经安装好的机器:sudo pip freeze > install_list.list 需要安装的机器:sudo pip install -r install_list.list

  8. 四、oracle基本sql语句和函数详解

    一.oracle常用数据类型 一.  数据定义语言(ddl) 数据定义语言ddl(data definition language)用于改变数据库结构,包括创建.更改和删除数据库对象. 用于操纵表结构 ...

  9. Kotlin 语言高级安卓开发入门

    过去一年,使用 Kotlin 来为安卓开发的人越来越多.即使那些现在还没有使用这个语言的开发者,也会对这个语言的精髓产生共鸣,它给现在 Java 开发增加了简单并且强大的范式.Jake Wharton ...

  10. Egret应用开发实践(01) Egret与WebPack

    Egret Egret引擎是一款使用TypeScript语言构建的开源免费的移动游戏引擎.Egret仅是纯粹的使用TypeScript语言来开发游戏,开发后可以使用Egret来打包为HTML5网页游戏 ...