Android异步消息处理机制(1)Handler基本使用

Android UI是线程不安全的,如果在子线程中尝试进行UI操作,程序就有可能会崩溃。解决的方案应该是创建一个Message对象,然后借助Handler发送出去,之后在Handler的handleMessage()方法中获得刚才发送的Message对象,然后在这里进行UI操作就不会再出现崩溃了。

这种处理方式被称为异步消息处理线程。简单的说就是在子线程中实现更新UI操作。

Handler基本使用

关于Handler的使用包括两种:

  • 从子线程(worker线程)中向主线程(UI线程)发送消息,在主线程中处理消息;
  • 从主线程(UI线程)中向子线程(worker线程)发送消息,在子线程中处理消息。

子线程向主线程发送消息

主要步骤如下:

  1. 在主线程自定义Handler(非抽象类)子类并实现handleMessage(Message)方法;
  2. 在worker Thread当中通过Handler对象的sendMessage(Message)方法发送Message;
  3. Handler对象将Message放在消息队列MessagQueue中;
  4. Looper将Message从消息队列中取出,并找到对应的Handler对象。
  5. Looper调用Handler对象的handleMessage(Message)方法处理Message。

其中,我们只要完成1,2两步,其余由系统完成。

主要代码如下:


//在main Thread中创建Handler对象
handler = new MyHandler();
//创建worker Thread
new Thread(new Runnable() {
    @Override
    public void run() {
    //创建消息对象
        Message message = handler.obtainMessage();
        message.obj = "我是从worker Thread向main Thread发送的消息";
        //发送消息对象
        handler.sendMessage(message);
    }
}).start();

其中,MyHandler类如下:


class MyHandler extends Handler {
    @Override
    public void handleMessage(Message msg) {
        Log.d("result:",Thread.currentThread().getName());
        //只有在main Thread中才能操作UI
        Log.d("result",(String)msg.obj);
    }
}

上述方法就实现了从子线程(worker线程)中向主线程(UI线程)发送消息,在主线程中处理消息。

主线程向子线程发送消息

主要步骤如下:


1. 准备Looper对象
2. 在 worker Thread生成Handler对象并实现`handleMessage()`方法;
3. 在MainThread当中通过Handler对象的`sendMessage(Message)`方法发送Message。

一般在子线程中的实现代码如下:


new Thread(){
    @Override
    public void run() {
        //准备Looper对象
        Looper.prepare();
        handler2 = new MyHandler();
        //循环检查消息队列,然后调用handleMessage()方法处理,若没有消息对象则该线程阻塞。
        Looper.loop();
    }
}.start();

这里仍然使用了上面的MyHandler类。然后直接在主线程中调用handler2的sendMessage(Message)方法就能向子线程中发送消息,并在子线程中处理消息了。代码如下:


Message message = handler2.obtainMessage();
message.obj = "我是从main Thread向worker Thread 发送的消息";
handler2.sendMessage(message);

上述方法就实现了从主线程(UI线程)中向子线程(worker线程)发送消息,在主线程中处理消息。

也就是在哪里创建Handler对象,就在哪里处理该对象。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-10 18:28:11

Android异步消息处理机制(1)Handler基本使用的相关文章

[Android] 异步消息处理机制(Handler 、 Looper 、MessageQueue)源码解析

1.Handler的由来 当程序第一次启动的时候,Android会同时启动一条主线程( Main Thread)来负责处理与UI相关的事件,我们叫做UI线程. Android的UI操作并不是线程安全的(出于性能优化考虑),意味着如果多个线程并发操作UI线程,可能导致线程安全问题. 为了解决Android应用多线程问题-Android平台只允许UI线程修改Activity里的UI组建,就会导致新启动的线程无法改变界面组建的属性值. 简单的说:当主线程队列处理一个消息超过5秒,android 就会抛

Android异步消息处理机制(4)AsyncTask源码解析

上一章我们学习了抽象类AsyncTask的基本使用(地址:http://blog.csdn.net/wangyongge85/article/details/47988569),下面我将以问答的方法分析AsyncTask源码内容,源码版本为:API22. 1. 为什么必须在UI线程实例化我们的AsyncTask,并且必须在主线程中调用execute(Params... params)? 在分析为什么在UI线程调用之前,我们先看一下实例化AsyncTask并调用execute(Params...

Android多线程----异步消息处理机制之Handler详解

关于Android的多线程知识,请参考本人之前的一篇博客:Android 多线程----AsyncTask异步任务详解 在Android当中,提供了异步消息处理机制的两种方式来解决线程之间的通信问题,一种是今天要讲的Handler的机制,还有一种就是之前讲过的 AsyncTask 机制. 一.handler的引入: 我们都知道,Android UI是线程不安全的,如果在子线程中尝试进行UI操作,程序就有可能会崩溃.相信大家在日常的工作当中都会经常遇到这个问题,解决的方案应该也是早已烂熟于心,即创

Android异步消息处理机制(3)asyncTask基本使用

本文翻译自android官方文档,结合自己测试,整理如下. 概述 AsyncTask抽象类,翻译过来就是异步任务,能够合理并方便的使用UI线程.该类可以实现将后台操作结果显示在UI线程中,而不需要我们自己实现子线程或者handler(当然它内部也是借助这两者实现的). 虽然AsyncTask可以提供后台运行并将结果显示在UI上,但是理想情况应该是后台操作最多只能是几秒钟,若要执行长时间的操作强烈建议使用java中的Executor,ThreadPoolExecutor,FutureTask等.

[学习总结]6、Android异步消息处理机制完全解析,带你从源码的角度彻底理解

开始进入正题,我们都知道,Android UI是线程不安全的,如果在子线程中尝试进行UI操作,程序就有可能会崩溃.相信大家在日常的工作当中都会经常遇到这个问题,解决的方案应该也是早已烂熟于心,即创建一个Message对象,然后借助Handler发送出去,之后在Handler的handleMessage()方法中获得刚才发送的Message对象,然后在这里进行UI操作就不会再出现崩溃了. 这种处理方式被称为异步消息处理线程,虽然我相信大家都会用,可是你知道它背后的原理是什么样的吗?今天我们就来一起

Android异步消息处理机制详解及源码分析

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处,尊重分享成果] 最近相对来说比较闲,加上养病,所以没事干就撸些自己之前的知识点为博客,方便自己也方便别人. 1 背景 之所以选择这个知识点来分析有以下几个原因: 逛GitHub时发现关注的isuss中有人不停的在讨论Android中的Looper , Handler , Me

Android异步消息处理机制(2)源码解析

上一章讲解了Android异步消息处理机制的基本使用,下面将简单地探寻一下异步机制背后的奥妙,源码版本为:API22. 首先,声明一下本文是在我参考了一下各位大神的文章之后才慢慢熟悉的, 若有不足之处,还望各位批评指正!.菜鸟上路,,,, 郭霖博客 鸿洋博客 刘超 深入解析android5.0系统 任玉刚博客 先后顺序按照拼音排序,无关技术本身. 先简单地总结一下Looper,MessageQueue,Message和Handler四者之间的关系: Looper和MessageQueue Loo

Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38377229 ,本文出自[张鸿洋的博客] 很多人面试肯定都被问到过,请问Android中的Looper , Handler , Message有什么关系?本篇博客目的首先为大家从源码角度介绍3者关系,然后给出一个容易记忆的结论. 1. 概述 Handler . Looper .Message 这三者都与Android异步消息处理线程相关的概念.那么什么叫异步消息处理线程呢?异步

Android异步消息处理机制——handle与Looper,AsyncTask

Android线程间的通讯采用异步消息处理机制,主要由四部分组成,包括Message,Handler,MessageQueue和Looper. 一个线程只有一个Looper与Messagequeue,但可以有多个handler实例. 例:线程A发消息Message,线程B处理消息Message. 需要在线程B中新建一个Handler实例handler,在A线程中通过该handler发送消息到线程B中的Messagequeue中, 通过B中的Looper以及先进先出的原则取出该消息并处理消息,所以