我认识Handler又多了一点点...

目录

Start、说在前面

一、初识Handler

1.1 概念

1.2 内容

1.3 小结

1.4 拓展

二、拓展Handler之ANR

2.1 概述ANR

2.2 产生原因

2.3 关系说明

三、拓展Handler之内存泄露

3.1 概述内存泄露

3.2 产生原因

3.3 解决办法

End、写在最后


Start、说在前面

Handler,相信做Android开发的小伙伴对他都不陌生了。

起初,我也是浮于表面的理解和学习(虽然现在也还是没有太深入,但有种比以前好了一些的感觉),慢慢地发现他竟然在Android中到处都可见。

所以今天分享出来我的一些总结,抛砖引玉,帮助更多人,同时也希望有更多动力去深入。

下面我们来说说他吧~

一、初识Handler

1.1 概念

对一个陌生事物了解,首先从概念开始。

简单说,Handler机制是Android中提供的一种异步回调机制,处理子线程和主线程之间的通信。

1.2 内容

涉及到相关重要类及职责是:

1)Handler:负责发送处理消息.

2)MessageQueue:消息队列,负责存储消息.

3)Message:具体发送的消息.

4)Looper:负责循环取出消息给Handler处理.

5)ThreadLocal:用于线程间的数据隔离,每个线程中存放各自对应的looper.

1.3 小结

机制运作总结:子线程中Handler将消息发送到MessageQueue中,然后Looper不断的从MessageQueue中读取消息并调用Handler.dispatchMessage发送消息,最后Handler处理消息。

1.4 拓展

当然内部机制详细内容仍然要详细追寻源码来发现其中的更多奥秘,这里就不展开说了。

通常我们使用Handler可以去刷新界面,可以去制作定时器等等,但没想到他竟然也跟ANR、内存泄露有着关系。那我们一起再看下去吧。

二、拓展Handler之ANR

2.1 概述ANR

ANR异常:Application Not Response 应用程序无响应 。出现这个异常时,会为用户弹出交互式弹窗,影响用户使用和体验。

2.2 产生原因

产生ANR异常的原因:在主线程执行了耗时操作,对Activity来说,主线程阻塞5秒将造成ANR异常,对BroadcastReceiver来说,主线程阻塞10秒将会造成ANR异常。

2.3 关系说明

Handler是线程间通讯的机制,Android中,网络访问、文件处理等耗时操作必须放到子线程中去执行,否则将会造成ANR异常。

解决ANR异常的方法:耗时操作都在子线程中去执行 但是,Android不允许在子线程去修改UI,可我们又有在子线程去修改UI的需求,因此需要借助Handler。

三、拓展Handler之内存泄露

3.1 概述内存泄露

内存泄露:没有用的对象资源仍与GC-Root保持可达路径,导致系统无法回收。

3.2 产生原因

一般造成的原因:

1)非静态内部类默认持有外部类的引用,比如非静态Handler持有Activity引用

2)接收器、监听器的注册没有取消,比如广播、EventBus

3)Activity的Context造成的

4)资源文件没有关闭造成的

等等,还有很多。

3.3 解决办法

我们可以看到Handler的使用不当也会导致内存泄露问题。

知道了之后,我们使用的时候就可以有的放矢、游刃有余的关注和解决了。

public class MyActivity extends Activity{

    //在Activity中 声明一个静态的Handler内部类 并持有外部类的弱引用
    private static class InnerHandler extends Handler{

        private final WeakReference<MyActivity> mActivity;
    
        public InnerHandler(MyActivity activity){
            mActivity = new WeakReference<MyActivity>(activity);
        }
        
        @Override
        public void handlerMessage(Message msg){
            MyActivity activity = mActivity.get();
            if(activity!=null){
            //...
            }
        }
    }
    
    private final InnerHandler mHandler = new InnerHandler(this);
    
    private static final runnable = new Runnable(){
    
        @Override
        public void run(){
            //...
        }
    
    };
    
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        
        //延时发送消息
        mHander.postDelayed(runnable,1000*60*5);
    }
}


当然其中涉及到了弱引用的使用,可以自行了解相关内容。

End、写在最后

这样串联下来,对Handler是否有了一个更全面的认识呢?

相信让Handler更充盈了一些。当然他不止这些。还需要我们更深入更广度的挖掘。探究内部原理,发现其中奥秘。

--------------------------------------------------------------------------

如有不妥之处,望见谅。提供您的宝贵建议、意见,我会积极改正的。

码字不易,如您喜欢欢迎收藏、点赞等支持,您的支持是我最大的动力!

后续有新文章的发布,欢迎持续关注。谢谢❤

也欢迎关注关注我的掘金博客 摩羯座程序媛 的个人主页 - 动态 - 掘金


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

摩羯座程序媛

打赏的老板越来越富

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值