Android Handler总结1-定义与用法

Handler是什么?

先来看看Android官网的描述:
A Handler allows you to send and process Message and Runnable objects associated with a thread’s MessageQueue. Each Handler instance is associated with a single thread and that thread’s message queue. When you create a new Handler, it is bound to the thread / message queue of the thread that is creating it – from that point on, it will deliver messages and runnables to that message queue and execute them as they come out of the message queue.

翻译过来就是:
Handler是用来结合线程的消息队列来发送、处理Message对象和Runnable对象的工具。每一个Handler实例之后会关联一个线程和该线程的消息队列。当你创建一个Handler的时候,从这时开始,它就会自动关联到所在的线程/消息队列,然后它就会陆续把Message/Runnalbe分发到消息队列,并在它们出队的时候处理掉。

总结来说,就是Handler是一个工具,一个用来发送和处理Message和Runnable对象的工具。

Handler的作用

官网描述如下:
There are two main uses for a Handler: (1) to schedule messages and runnables to be executed at some point in the future; and (2) to enqueue an action to be performed on a different thread than your own.

翻译过来就是:
handler有两个主要用途:
1、推送未来某个时间点将要执行的Message或者Runnable到消息队列。
2、在子线程把需要在另一个线程执行的操作加入到消息队列中去。

Handler使用方法

1、推送未来某个时间点将要执行的Message或者Runnable到消息队列。
方法一:Handler+Message

public class MainActivity extends AppCompatActivity {

    private String TAG = "testHandler";
    private Button testBtn;
   
   //忽略此处的内存泄漏
    private Handler myHandler = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            testBtn.setText(msg.what+"");
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        testBtn = (Button) findViewById(R.id.sample_text);
        testBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                for (int i = 0; i < 60; i++) {
                    Message message = Message.obtain(myHandler);
                    message.what = 60 - i;
                    myHandler.sendMessageDelayed(message, i * 1000);
                }
            }
        });
    }
}

方式二:Handler+Runnable

public class MainActivity extends AppCompatActivity {

    private String TAG = "testHandler";
    private Button testBtn;

    private Handler myHandler = new Handler(Looper.getMainLooper());

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        testBtn = (Button) findViewById(R.id.sample_text);
        testBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                for (int i = 0; i < 60; i++) {
                    final int time = 60 - i;
                    myHandler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                           //此处并不是在新的线程中,该线程和Handler所在线程一致
                            testBtn.setText(time + "");
                        }
                    }, i * 1000);
                }
            }
        });
    }
}

方式一和方式二本质上是一样的,因为Handler发送Runnable对象最后也会被转化成Message对象。

实际开发中我们可以这样处理:如果传输的数据较复杂可以使用Handler+Message的方式,如果需要执行的操作简单则使用Handler+Runnable的方式。

2、在子线程把需要在另一个线程执行的操作加入到消息队列中去

public class MainActivity extends AppCompatActivity {

    private String TAG = "testHandler";
    private Button testBtn;

    private Handler myHandler = new Handler(Looper.getMainLooper());

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        testBtn = (Button) findViewById(R.id.sample_text);
        testBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 开启一个线程
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        // 执行耗时的操作,比如复杂的计算,网络请求等;
                        ....
                        //通过Looper.getMainLooper()获取主线程(其他线程)的Handler
                        Handler handler = new Handler(Looper.getMainLooper());
                        // 通过Handler的post方法将Runnable对象发送到UI线程的MessageQueue中
                        handler.post(new Runnable() {
                            @Override
                            public void run() {
                                // 在MessageQueue出队该Runnable时进行的操作
                                  testBtn.setText(time + "");
                            }
                        });
                    }
                }).start();

            }
        });
    }
}




好家伙,随手就是一个赞~

在这里插入图片描述
给作者买瓶咖啡提提神~






我的视频课

下面是我录制的一些视频课,欢迎大家围观~

《Android性能优化参考》

本课程包含了Android中的App启动优化、UI优化、内存优化、图片优化、耗电量等常见的性能优化场景,通过学习此课程,你将对整个Android性能优化体系有清晰的认识。

性能优化作为Android高级开发的必备技能,也是大厂面试必考的题目,是体现一个人技术深度最好的试金石。

《面试之排序算法》

排序算法是我们面试被问到最多的基础算法,本课程详细介绍了七种排序算法,包括插入排序、选择排序、冒泡排序、谢尔排序、快速排序、堆积排序和二路并归排序。每种算法都详细介绍了核心思想、详细步骤、时间复杂度和代码实现,希望帮助大家深入理解排序算法,搞定面试!

《Android混合App开发实战》

本课程为Android HyBrid App开发实战课程,由浅入深,从三种App的历史和特点开始,介绍了Android WebView的使用、Java和JS交互的原生方式、著名的WebView安全漏洞、JSBridge的原理和使用,最后通过一个网上商城的实战综合全部内容,让同学们掌握并深入理解Android HyBrid App开发。

《AI导论》

介绍人工智能AI的诞生历史和到现在为止的不同发展阶段;介绍了AI领域中常见的名词概念和其关系,包括机器学习、深度学习、神经网络结构搜索 NAS、生成对抗网络 GAN等;最后对AI发展做出展望。
本课程属于导论课程,旨在帮助同学们从宏观层面把握AI,建立AI的知识体系。

《Java注解精讲》

本课程详细介绍了Java中的注解机制,包括注解的定义和分类,注解的使用和自定义,注解的源码和架构分析;
本课程语言简单凝练,视频短小精悍,让你一次彻底搞懂Java注解!

《Java反射精讲》

反射是Java中重要的也是较难理解的内容;
本课程从反射的定义、作用、原理和使用出发,全方位帮你彻底搞定反射;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不死鸟JGC

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值