handler的总结

作用:个人感觉就是管理线程的消息队列的,比如在管理主线程的消息队列的时候,会把一些复杂的操作放到其他线程做操作,然后把最后的结果加到主线程的消息队列里,然后触发handleMessage进行处理
解决办法:静态内部类+ 弱引用

使用:大家用的时候 肯定会考虑到如何防止内存泄漏的问题
问题1:为什么handler会引起内存泄漏
我们都知道 非静态的内部类或是匿名类回持有外部类的引用,这样的话在一个Activity中,handelr持有activtiy的对象的引用,当handler还没有执行完毕,但是关闭activtiy,正常activtiy关闭了就会被回收,但是handler还没有释放,还持有者activity的对象,这样activity的对象即使在内存不足的时候也不会被回收,这样反复操作,多了的话就会容易出现oom

问题2:为什么静态内部类+ 弱引用可以解决
静态的内部类不回持有外部类的引用,但是这样我们又拿不到当前activtiy的对象了,所以加个弱引用,这样的话,我们即能不持有外部类的引用,也能获取到当前activtiy的对象,当handler没有处理完毕,就关闭的activtiy的时候,因为是弱引用,GC也一样会回收 activtiy这个对象的,这样就解决了
下面是个简单的例子

private static class MyHandler extends Handler {//定义成静态的内部类
        WeakReference<MainActivity> weakReference;//弱引用
       MyHandler(MainActivity activity) {
            weakReference = new WeakReference<MainActivity>(activity);
        }

        @Override
        public void handleMessage(Message msg) {

            MainActivity activity = weakReference.get();
            switch (msg.what) {
                case 1:
                    activity.textView.setText((String) msg.obj);
                    break;
                default:
                    break;
            }
        }
    }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 所有知识点已整理成app app下载地址 J2EE 部分: 1.Switch能否用string做参数? 在 Jav...
    侯蛋蛋_阅读 7,282评论 1 4
  • 前言 对于内存泄漏,我想大家在开发中肯定都遇到过,只不过内存泄漏对我们来说并不是可见的,因为它是在堆中活动,而要想...
    EsonJack阅读 4,529评论 1 3
  • 前言 Handler是Android消息机制的上层接口,平时使用起来很方便,我们可以通过它把一个任务切换到Hand...
    eagleRock阅读 5,569评论 0 13
  • Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏...
    神奇的小蘑菇阅读 3,471评论 0 0
  • 一、产品定义:解决某些问题的东西,有形和无形,本书主谈商品,解决用户和公司问题 二、产品: 1.用户参与设计 2....
    张巧玲May阅读 3,935评论 1 1