• 我认识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的使用不当也会导致内存泄露问题。

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

    1. public class MyActivity extends Activity{
    2.     //在Activity中 声明一个静态的Handler内部类 并持有外部类的弱引用
    3.     private static class InnerHandler extends Handler{
    4.         private final WeakReference mActivity;
    5.     
    6.         public InnerHandler(MyActivity activity){
    7.             mActivity = new WeakReference(activity);
    8.         }
    9.         
    10.         @Override
    11.         public void handlerMessage(Message msg){
    12.             MyActivity activity = mActivity.get();
    13.             if(activity!=null){
    14.             //...
    15.             }
    16.         }
    17.     }
    18.     
    19.     private final InnerHandler mHandler = new InnerHandler(this);
    20.     
    21.     private static final runnable = new Runnable(){
    22.     
    23.         @Override
    24.         public void run(){
    25.             //...
    26.         }
    27.     
    28.     };
    29.     
    30.     @Override
    31.     protected void onCreate(Bundle savedInstanceState){
    32.         super.onCreate(savedInstanceState);
    33.         
    34.         //延时发送消息
    35.         mHander.postDelayed(runnable,1000*60*5);
    36.     }
    37. }


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

    End、写在最后

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

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

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

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

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

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

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


     

  • 相关阅读:
    02-Vue li环境搭建
    11.9 - 每日一题 - 408
    SAP 快速Debug财务替代GGB1
    刨根问底 Redis, 面试过程真好使
    Spring Boot与Shiro实现权限管理02
    Apple:万亿收入指日可待
    下载无水印抖音视频
    软件测试(基础篇)
    视频监控管理平台EasyCVR自动注销后,页面还存留播放窗口是什么原因?解决办法是什么?
    【Java SE】 详解java访问限定符
  • 原文地址:https://blog.csdn.net/wj9966/article/details/126767461