Android中Handler警告的解决办法

经常,在我们使用Handler的时候,会出现This Handler class should be static or leaks might occur,对于有代码洁癖的人.来说时忍受不了的.

那么我们该怎么解决呢?

查阅了很多文章,大致的解释是:在程序消息队列中排队的消息保持了对目标Handler类的应用。如果Handler是个内部类,那么它也会保持它所在的外部类(通常是Activity或者Service等)的引用。只要有消息在队列中,那么Handler便无法被回收,如果Handler不是static那么使用Handler的Service和Activity就也无法被回收,这就可能导致内存泄露。

一般我们是在Handler中保持一个外部类的弱引用

//声明一个static class,继承自Handler,
    //并持有外部类的弱引用(此时假设外部类是ParentActivity)
    private static class MyHandler extends Handler {
        WeakReference mOuterClass;
        MyHandler(OuterClass clz) {
                mOuterClass clz= new WeakReference(clz);
        }
        @Override
        public void handleMessage(Message msg) {
              OuterClass clz= mOuterClass.get();
            switch (msg.what) {
            case SOMETHING:
                clz.doSomething();
                break;
            defaule:
                break;
            }
        }
    };

    //然后声明,之后使用handler即可
    private MyHandler handler = new MyHandler(this);
时间: 2024-12-29 23:58:58

Android中Handler警告的解决办法的相关文章

Android Eclipse工程开发中的常见调试问题(二)android.os.NetworkOnMainThreadException 异常的解决办法

android.os.NetworkOnMainThreadException 异常的解决办法, 刚开是把HttpURLConnectionnection 打开连接这个方法放在UI线程里了,可能不是线程安全的,而且这个方法请求是需要等待的,所以就抛出了这个异常,后来用子线程打开的HttpURLConnection, 一切就都正常了,只要在主线程里开启子线程就行了.子线程利用URL 问题解决.下面贴一段代码 String file1 = SERVER_PATH; URL url = new URL

深入解析Android中Handler消息机制

Android提供了Handler 和 Looper 来满足线程间的通信.Handler先进先出原则.Looper类用来管理特定线程内对象之间的消息交换(MessageExchange).Handler消息机制可以说是Android系统中最重要部分之一,所以,本篇博客我们就来深入解析Android中Handler消息机制. Handler的简单使用 为什么系统不允许子线程更新UI 因为的UI控件不是线程安全的. 如果在多线程中并发访问可能会导致UI控件处于不可预期的状态,那为什么不对UI控件的访

Xamarin Android SDK无法更新的解决办法

Xamarin Android SDK无法更新的解决办法,更新时候,提示警告信息:A folder failed to be moved.出现这种情况,往往是从Visual Studio或者Xamarin Studio中直接运行了SDK Mananger.解决办法是从SDK目录中,手动运行SDK Manager.exe.如果还是无法解决,右击该文件,选择以管理员身份运行即可.

CUDA程序编译过程中产生警告的解决方法

有时候经常使用别人用Tabhost+其它的实现demo.单纯利用Tabhost该如何使用呢? 下面看例子: public class MainActivity extends TabActivity { public TabHost tabHost; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 获取对象 tabHost = getTabH

Android中Handler 、Thread和Runnable之间的关系

在多线程编程的时候,我们经常会用到Handler,Thread和Runnable这三个类,我们来看看这三个类之间是怎么样的关系? 首先说明Android的CPU分配的最小单元是线程,Handler一般是在某个线程里创建的,因而Handler和Thread就是相互绑定的,一一对应. 而Runnable是一个接口,Thread是Runnable的子类.可以说,他俩都算一个进程. HandlerThread顾名思义就是可以处理消息循环的线程,他是一个拥有Looper的线程,可以处理消息循环. 与其说H

【转】Android出现“Read-only file system”解决办法

原文网址:http://www.111cn.net/sj/android/44496.htm 下面介绍一篇Android出现“Read-only file system”解决办法 有碰到这类问题的朋友可参考参考. Android-出现Read-only file system的解决方法 输入命令:  代码如下 复制代码 mount -o remount rw /system (每次都要执行一次) 有的朋友说是是“/”的问题,命令改为:adb push AlarmClock.apk systema

Ubuntu使用adb连接android手机失败unknown的解决办法

Ubuntu下通过USB数据线连接G11手机后,adb可能无法识别到设备.按照一下步骤可以解决此问题. 1.在terminal下面输入 lsusb [email protected]:~$ lsusb Bus 001 Device 002: ID 8087:8008 Intel Corp. Bus 002 Device 002: ID 8087:8000 Intel Corp. Bus 003 Device 048: ID 17ef:7435 Lenovo Bus 003 Device 002:

利用反射将IDataReader读取到实体类中效率低下的解决办法

原文:利用反射将IDataReader读取到实体类中效率低下的解决办法 最开始使用反射一个类型的各个属性,对气进行赋值的代码如下: public static List<T> ToList<T>(IDataReader reader) { //实例化一个List<>泛型集合 List<T> DataList = new List<T>(); PropertyInfo[] properties = typeof(T).GetProperties()

Android Dependencies被误删除的解决办法

转自http://www.eoeandroid.com/thread-272679-1-1.html 第三方jar的导入方式 在新版本的ADT环境下,只需要在工程目录下新建libs文件夹(注意是libs不是lib),然后将第三方的jar复制进去,eclipse会自动将这个jar添加到Android Dependencies文件夹下,不必在通过BuildPath自己去修改了,也不需要ReferenceLibrary了. 另外,如果多个工程有关联的话,比如A工程设置为IsLibaray,B工程要引入