Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android精通之Handler讲解

Android精通之Handler讲解

作者头像
达达前端
发布于 2019-07-03 04:21:09
发布于 2019-07-03 04:21:09
50900
代码可运行
举报
文章被收录于专栏:达达前端达达前端
运行总次数:0
代码可运行

版权声明:未经博主允许不得转载

封面图

一:简介

软件技术人员,时代作者,从 Android 到全栈之路,我相信你也可以!阅读他的文章,会上瘾!You and me, we are family !

二:重点

那么什么是Handler呢?为什么要使用Handler呢?如何去实现呢?我们要了解Handler的工作原理在学Handler中,我们要知道并学习Handler,Looper,MessageQueue,Message等知识点。

消息循环机制

Handler

1.Looper循环者

2.Message消息

3.MessageQueue消息队列(专门存放消息的)

一:在Handler学习中,主要了解Handler,Looper,MessageQueue,Message,Handler的作用将Message对象发送到MessageQueue中,Looper的作用像个发动机,从MessageQueue中取出数据交给Handler中的handleMessage方法。

Handler的方法以及使用

1.Handler.sendMessage()

2.Handler.post()

二:在onCreate中为主线程/UI线程,做一些轻量级的事情 主线程:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//创建一个Handler
final Handler handler = new Handler(){
  @Override
  public void handleMessage(Message msg) {
     super.handleMessage(msg);

  /*
    * 接到子线程发出来的消息,处理
    * */
     //处理消息
    Log.i(TAG,"handleMessage:" + msg.what);

      if (msg.what==110){
        textView.setText("huang");
        }
     }
};

子线程:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
* 有可能做大量耗时的操作
* 子线程
 * */
  new Thread(new Runnable() {
        @Override
        public void run() {
          try {
               Thread.sleep(10000);
              } catch (InterruptedException e) {
                e.printStackTrace();
          }

          /*
           * 通知UI更新
           * */
           handler.sendEmptyMessage(110); 
    }
}).start();

三: Handler public class Handler extends Object 导入android.os.Handler

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//子类
[AsyncQueryHandler][AsyncQueryHandler.WorkerHandler][HttpAuthHandler][SslErrorHandler]

处理程序: 处理Message与线程关联的Runnable对象MessageQueue,第一,安排将要执行的消息和可执行的程序;二,在不用的线程执行任务。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
调度消息和实现
sendMessage(Message msg)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)

sendEmptyMessage(int)
post(Runnable)
postAtTime(Runnable,log)
postDelayed(Runnable,Object,log)
//有很多方法还是要查官方文档的好

SystemClock.uptimeMillis()为系统时间,给执行带来额外的延迟

这里了解一下源码里有
obtainMessage(参数)
what:int:要分配给返回的Message.what字段的值。
arg1:int:要分配给返回的Message.arg1字段的值。
arg2:int:要分配给返回的Message.arg2字段的值。

//
发送消息延迟sendMessageAtTime

四://Two

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MainActivity extends AppCompatActivity {
//主线程
}

在子线程中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                /*
                * 有可能做大量耗时的操作
                * 子线程
                * */
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Thread.sleep(10000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                        /*
                        * 通知UI更新
                        * */
                    
                        Message message = Message.obtain();
                        message.what=1;
                        message.arg1=2;
                        message.arg2=3;
                        message.obj=MainActivity.this;
                        handler.sendMessage(message);

                        //定时任务
                        handler.sendMessageAtTime(message,SystemClock.uptimeMillis() + 5000);
                        handler.sendMessageDelayed(message,5000);

                        //运行可执行对象 消息来做
                        /*handler.post(new Runnable() {
                            @Override
                            public void run() {
                               执行代码
                            }
                        });*/
                        final Runnable runnable = new Runnable() {
                            @Override
                            public void run() {
                                //执行代码
                            }
                        };
                        handler.post(runnable);
                        runnable.run();
                        //定时任务
                        handler.postDelayed(runnable,5000);

                    }
                }).start();

            }
        });

五: 在子线程中先调用 Looper.prepare(),然后Handler handler = new Handler();//...//Looper.loop();

了解一下Looper

Looper为线程运行消息循环的类。线程默认情况下没有与它们相关的消息循环;创建一个,在要运行循环的线程中调用prepare(),然后让loop()处理,直到循环停止。

与消息循环的大多数交互是通过Handler类。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class LooperThread extends Thread {
public void run() {
     Looper.prepare();
     Handler mHandler = new Handler() {
             public void handleMessage(Message msg) {
                 
         }
     };
  Looper.loop();
}
}

六:强引用与弱引用

什么是强引用和弱引用呢?对象的引用机制,使得程序能够灵活地控制对象的生命周期。

强引用(StrongReference)

强引用可以理解为我们生活中必不可少的东西,如你的手机,当你空间不足时(占用空间),你也不会丢弃它,宁可抛出异常,在Java中最为常见的对象,只要此引用存在并且没有被释放就不会被垃圾回收机制回收,只有当释放了,才可能回收。

弱引用(WeakReference)

弱引用即是生活中可有可无的东西,在Java中如果一个对象具备弱引用,那么不管空间是否足够都会被回收。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//创建一个对象
Person person=new Person();
WeakReference<Person> weakPerson=new WeakReference<Person>(person);

七:防止内存泄漏:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static class MyHandler extends Handler{
 //WeakReference
 WeakReference<MainActivity> weakReference;
 public MyHandler(MainActivity activity){
  weakReference = new WeakReference<MainActivity>(activity);
 }
 public void handleMessage(Message msg){
  super.handleMessage(msg);
   if(weakReference.get() != null){
   } 
 }
}

当weakReference.get() != null,表示weakReference指向的对象activity没有被回收。 如果此方法返回为空的话,说明weakReference指向的对象activity已经被回收。 只要指向还指向就不会被回收。

八:例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class OneActivity extends Activity{
 private MyHandler mHandler=new MyHandler(this);
    public static class MyHandler extends Handler{
        
        public final WeakReference<OneActivity > mWeakReference;

        public DiglettHandler(OneActivity activity) {
            mWeakReference = new WeakReference<>(activity);
        }

     @Override
     public void handleMessage(Message msg) {
         super.handleMessage(msg);

         OneActivity activity = mWeakReference.get();
    }
 }
}

九:复习快捷键

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Ctrl+n 查找类
Ctrl+Alt+L 格式化代码
Ctrl+d 复制行
Ctrl+y 删除行

编辑 :达叔

信箱:2397923107@qq.com

定位:分享 Android&Java 知识点

我是简书的达叔小生。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.07.02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android开发:详解Handler的内存泄露
上面提到,在Java里,非静态内部类和匿名类都会潜在的引用它们所属的外部类。 但是,静态内部类不会。
Carson.Ho
2019/02/22
1.2K1
小题大做 | Handler内存泄露全面分析
"内部类持有了外部类的引用,也就是Hanlder持有了Activity的引用,从而导致无法被回收呗。"
码上积木
2021/01/11
9670
小题大做 | Handler内存泄露全面分析
android学习笔记----Handler的使用、内存泄漏、源码分析等一系列问题
学习路径,先看慕课网视频:https://www.imooc.com/learn/267
砖业洋__
2023/05/06
6500
android学习笔记----Handler的使用、内存泄漏、源码分析等一系列问题
Android Handler 机制简单讲解
现在很多项目,可能Handler用的少了。但是如果你去面试,总是避免不了被问Handler原理等等。
zinyan.com
2023/07/14
4880
Android Handler 机制简单讲解
Android面试每日一题: Handler 如何有效地避免内存泄漏问题
在Android系统中,Handler是一个消息发送和处理机制的核心组件之一,与之配套的其他主要组件还有Looper和Message,MessageQueue。 Message和Runnable类是消息的载体。MessageQueue是消息等待的队列。Looper则负责从队列中取消息。
老马的编程之旅
2022/09/21
8801
Android面试每日一题: Handler 如何有效地避免内存泄漏问题
Handler、Message、Looper、MessageQueue
handler消息机制原理:本质就是在线程之间实现一个消息队列(MessageQueue)。 生产者Handler在异步线程通过sendMessageDelayed() 将消息添加至MessageQueue, 消费者Looper通过loop()中死循环将MessageQueue中的msg取出后发送给产生此msg的handler的handleMessage() 在主线程进行处理;
用户9854323
2022/06/25
3810
Handler、Message、Looper、MessageQueue
Android应用界面开发——Handler(实现倒计时)
当一个程序第一次启动时,Android会同时启动一条主线程(Main Thread),主线程主要负责处理与UI相关的事件,所以,主线程通常又被叫做UI线程。
trampcr
2018/09/28
1.1K0
Android应用界面开发——Handler(实现倒计时)
面试官还问Handler?那我要给你讲个故事
Handler的相关博客太多了,随便一搜都一大把,但是基本都是上来就贴源码,讲姿势,短时间不太好弄明白整体的关系,和流程.
没关系再继续努力
2021/12/25
4720
深入探讨Android异步精髓Handler
众所周知,Android的UI是在其主线程中进行刷新的,所以Google建议开发人员切勿在主线程中进行耗时的操作否则很容易导致应用程序无响应(ANR)。鉴于此几乎接近硬性的要求,我们常把耗时的操作(比如网络请求)置于子线程中进行;但是子线程不能直接访问UI。
开发者技术前线
2020/11/23
6260
深入探讨Android异步精髓Handler
Handler面试必问八大题:如何深挖原理进大厂?1万+字带你详细剖析!
Handler一直是面试过程中的常客,我们今天来看看围绕Handler究竟能玩出那些花儿来。
Android技术干货分享
2021/08/27
1.5K0
Handler面试必问八大题:如何深挖原理进大厂?1万+字带你详细剖析!
「细品源码」 Android 系统的血液:Handler
作为 Android 开发者,相信对于 Handler 的使用早已烂熟于心。Handler 对于 Android 非常重要,可以说,没有它,Android App 就是一堆“破铜烂铁”,它就像 Android 的血液,穿梭在 App 的各个角落,输送养分。
开发的猫
2020/06/19
1K0
「细品源码」 Android 系统的血液:Handler
Android异步通信:你了解Handler内存泄露吗?
在Android开发中,内存泄露十分常见。本文将详细讲解内存泄露的其中一种情况:在Handler中发生的内存泄露
Carson.Ho
2022/03/25
7610
Android异步通信:你了解Handler内存泄露吗?
从面试官角度看Handler:掌握技巧,事半功倍!
在Android开发领域,Handler是一项关键技能,尤其在面试中,对Handler的深刻理解和熟练运用往往是衡量一位Android开发者水平的重要标志。本文将从面试官的角度出发,针对Android Handler技术展开详细的解析,深入剖析高级疑难问题,帮助读者更好地准备面试。
Rouse
2023/12/13
4290
从面试官角度看Handler:掌握技巧,事半功倍!
Android消息机制——Handler
从上面可以看出,在子线程中创建Handler之前,要调用 Looper.prepare()方法,Handler创建后,还要调用 Looper.loop()方法。而前面我们在主线程创建Handler却不要这两个步骤,因为系统帮我们做了。
用户1205080
2019/04/05
1.3K0
Android消息机制——Handler
Handler引起的内存泄漏及解决方法
当使用内部类或匿名内部类的方式创建Handler时,Handler对象会隐式地持有一个外部类对象的引用(这里的外部类是Activity)。一般在一个耗时任务中会开启一个子线程,如网络请求或文件读写操作,我们会使用到Handler对象。但是,如果在任务未执行完时,Activity被关闭了,Activity已不再使用,此时由GC来回收掉Activity对象。由于子线程未执行完毕,子线程持有Handler的引用,而Handler又持有Activity的引用,这样直接导致Activity对象无法被GC回收,即出现内存泄漏。
程思扬
2022/01/10
7860
一篇文章扒掉“桥梁Handler”的底裤
Android跨进程要掌握的是Binder, 而同一进程中最重要的应该就是Handler 消息通信机制了。我这么说,大家不知道是否认同,如果认同,还希望能给一个关注哈。
BlueSocks
2022/03/21
2480
一篇文章扒掉“桥梁Handler”的底裤
异步线程大师Handler(源码+图+demo+常见问题)
Handler 机制 源码+图+常见问题+Demo 详细记录(本文内容略长,但内容较为详细,推荐Android开发者可深入观看.如有问题,欢迎指正)
Anymarvel
2019/03/19
5350
异步线程大师Handler(源码+图+demo+常见问题)
Android-强,软,弱,虚引用
      啥是强引用?举个例子,我们平时new 的对象,就都是强引用。如: String s =new String(),这就是一个强引用,那么强引用有啥特点呢?
android_薛之涛
2018/09/12
5080
Android-强,软,弱,虚引用
优化 Android Handler提升性能与稳定性
Handler 是一个常见的组件,它在 Android 应用程序开发中被广泛使用。Handler 可以将消息传递给主线程,使开发者能够在子线程中进行长时间的耗时操作,同时也避免了因在主线程中更新 UI 而出现的卡顿和 ANR 问题。
Rouse
2023/08/31
4190
优化 Android Handler提升性能与稳定性
相关推荐
Android开发:详解Handler的内存泄露
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验