前言:

无论是现在所做的项目还是以前的项目中,都会遇见线程之间通信、组件之间通信,目前统一采用EventBus来做处理,在总结学习EventBus之前,觉得还是需要学习总结一下最初的实现方式,也算是不忘初心吧,这也是今天来学习总结Handler消息机制的一个原因。

消息传递相关文章地址:

Handler机制产生背景

一个Android应用程序被创建的时候都会创建一个UI主线程,但是有时我们会有一些比较耗时的操作,为了防止阻塞UI主线程,我们会将耗时的操作放到子线程中进行处理,处理完之后操作UI,但是Android不允许子线程操作UI,违背了Android单线程模型的原则(即 Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行),所以Android通过Handler消息机制来实现线程之间的通讯。

Handler机制主要角色

Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理。

Handler:处理者,负责Message的发送及处理。使用Handler时,需要实现handleMessage(Message msg)方法来对特定的Message进行处理,例如更新UI等。

MessageQueue:消息队列,用来存放Handler发送过来的消息,并按照FIFO规则执行。当然,存放Message并非实际意义的保存,而是将Message以链表的方式串联起来的,等待Looper的抽取。

Looper:消息泵,不断地从MessageQueue中抽取Message执行。因此,一个MessageQueue需要一个Looper。

Thread:线程,负责调度整个消息循环,即消息循环的执行场所。

Handler机制主要运用

1.)发送消息,在不同的线程间发送消息,使用的方法为sendXXX();
  1. sendEmptyMessage(int);//发送一个空的消息
  2. sendMessage(Message);//发送消息,消息中可以携带参数
  3. sendMessageAtTime(Message, long);//未来某一时间点发送消息
  4. sendMessageDelayed(Message, long);//延时Nms发送消息

举例:

主线程定义Handler

  1. Handler mHandler = new Handler() {
  2.  
  3. @Override
  4. public void handleMessage(Message msg) {
  5. super.handleMessage(msg);
  6. switch (msg.what) {
  7. case 0:
  8. //完成主界面更新,拿到数据
  9. String data = (String) msg.obj;
  10. textView.setText(data);
  11. break;
  12. default:
  13. break;
  14. }
  15. }
  16. };

子线程发消息,通知Handler完成UI更新

  1. private void getDataFromNet() {
  2. new Thread(new Runnable() {
  3.  
  4. @Override
  5. public void run() {
  6. //耗时操作,完成之后发送消息给Handler,完成UI更新;
  7. mHandler.sendEmptyMessage(0);
  8.  
  9. //需要数据传递,用下面方法;
  10. Message msg = new Message();
  11. msg.obj = "网络数据";//可以是基本类型,可以是对象,可以是List、map等;
  12. mHandler.sendMessage(msg);
  13. }
  14.  
  15. }).start();
  16. }
2.)计划任务,在未来执行某任务,使用的方法为postXXX();
  1. post(Runnable);//提交计划任务马上执行
  2. postAtTime(Runnable, long);//提交计划任务在未来的时间点执行
  3. postDelayed(Runnable, long);//提交计划任务延时Nms执行

示例:

主线程定义Handler

  1. private Handler mHandler=new Handler();

子线程提交任务更新UI

  1. private void getDataFromNet() {
  2. new Thread(new Runnable() {
  3.  
  4. @Override
  5. public void run() {
  6. //耗时操作,完成之后提交任务更新UI
  7. final String data = "网络数据";
  8. mHandler.post(new Runnable() {
  9. @Override
  10. public void run() {
  11. textView.setText(data);
  12. }
  13. });
  14. }
  15. }).start();
  16. }

Handler机制扩展

为了更加方便的使用Handler消息机制,Android也提供了几种扩展方式,内部实现都是基于Handler消息机制

1.) Activity.runOnUiThread(Runnable)
  1. private void getDataFromNet() {
  2. new Thread(new Runnable() {
  3.  
  4. @Override
  5. public void run() {
  6. //耗时操作,完成之后提交任务更新UI
  7. final String data = "网络数据";
  8. runOnUiThread(new Runnable() {
  9. @Override
  10. public void run() {
  11. textView.setText(data);
  12. }
  13. });
  14. }
  15. }).start();
  16. }
2 .)View.post(Runnable)
  1. private void getDataFromNet() {
  2. new Thread(new Runnable() {
  3.  
  4. @Override
  5. public void run() {
  6. //耗时操作,完成之后提交任务更新UI
  7. final String data = "网络数据";
  8. textView.post(new Runnable() {
  9. @Override
  10. public void run() {
  11. textView.setText(data);
  12. }
  13. });
  14. }
  15. }).start();
  16. }

5.)使用AsyncTask代替Thread

  1. private void getDataFromNet() {
  2. MyTask task = new MyTask();
  3. task.execute();
  4. }
  5.  
  6. private class MyTask extends AsyncTask {
  7.  
  8. //后台线程执行时
  9. @Override
  10. protected Object doInBackground(Object... params) {
  11. ////耗时操作,
  12. String data = "网络数据";
  13. return data;
  14. }
  15.  
  16. //后台线程执行结束后的操作,其中参数result为doInBackground返回的结果
  17. @Override
  18. protected void onPostExecute(Object result) {
  19. super.onPostExecute(result);
  20. textView.setText((String) result);
  21. }
  22. }

小结:

至此Handler消息简单的总结到此结束,更多内部具体实现可以参考

1.http://www.cnblogs.com/angeldevil/p/3340644.html

2.http://blog.csdn.net/fei0724/article/details/8664462

Android消息传递之Handler消息机制的更多相关文章

  1. Android Handler消息机制不完全解析

    1.Handler的作用 Android开发中,我们经常使用Handler进行页面的更新.例如我们需要在一个下载任务完成后,去更新我们的UI效果,因为AndroidUI操作不是线程安全的,也就意味着我 ...

  2. Handler消息机制的一些原理(直接用code讲解)——Android开发

    package com.example.handlertest; import android.os.Bundle; import android.os.Handler; import android ...

  3. Android Handler消息机制源码解析

    好记性不如烂笔头,今天来分析一下Handler的源码实现 Handler机制是Android系统的基础,是多线程之间切换的基础.下面我们分析一下Handler的源码实现. Handler消息机制有4个 ...

  4. 【Android】Handler消息机制

    Handler消息机制主要涉及Looper.Handler.MessageQueue.Message.其中,Looper主要负责获取消息,Handler负责发送消息及处理消息,MessageQueue ...

  5. Android全面解析之由浅及深Handler消息机制

    前言 很高兴遇见你~ 欢迎阅读我的文章. 关于Handler的博客可谓是俯拾皆是,而这也是一个老生常谈的话题,可见的他非常基础,也非常重要.但很多的博客,却很少有从入门开始介绍,这在我一开始学习的时候 ...

  6. Android Handler 消息机制原理解析

    前言 做过 Android 开发的童鞋都知道,不能在非主线程修改 UI 控件,因为 Android 规定只能在主线程中访问 UI ,如果在子线程中访问 UI ,那么程序就会抛出异常 android.v ...

  7. 深入理解 Handler 消息机制

    记得很多年前的一次面试中,面试官问了这么一个问题,你在项目中一般如何实现线程切换? 他的本意应该是考察 RxJava 的使用,只是我的答案是 Handler,他也就没有再追问下去了.在早期 Andro ...

  8. Handler消息机制与Binder IPC机制完全解析

    1.Handler消息机制 序列 文章 0 Android消息机制-Handler(framework篇) 1 Android消息机制-Handler(native篇) 2 Android消息机制-H ...

  9. Handler消息机制实现更新主UI

    如下实现的是简单的更新主UI的方法,用Handler消息机制 将textview的内容每隔一秒实现num++ /* * handler消息机制 * asynctask异步任务 *  * httpcli ...

随机推荐

  1. Mapreduce的文件和hbase共同输入

    Mapreduce的文件和hbase共同输入 package duogemap;   import java.io.IOException;   import org.apache.hadoop.co ...

  2. C# ini文件操作【源码下载】

    介绍C#如何对ini文件进行读写操作,C#可以通过调用[kernel32.dll]文件中的 WritePrivateProfileString()和GetPrivateProfileString()函 ...

  3. Android Ormlite 学习笔记1 -- 基础

    Ormlite 是一个开源Java数据实体映射框架.其中依赖2个核心类库: 1.ormlite-android-4.48.jar 2.ormlite-core-4.48.jar 新建项目,引用上面2个 ...

  4. SDWebImage源码解读 之 NSData+ImageContentType

    第一篇 前言 从今天开始,我将开启一段源码解读的旅途了.在这里先暂时不透露具体解读的源码到底是哪些?因为也可能随着解读的进行会更改计划.但能够肯定的是,这一系列之中肯定会有Swift版本的代码. 说说 ...

  5. [开发笔记]GCC 分支预测优化

    #define likely(x) __builtin_expect(!!(x),1)#define unlikely(x) __builtin_expect(!!(x),0) 用于优化在做分支判断的 ...

  6. javaScript之BOM操作1

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. SAP CRM 树视图(TREE VIEW)

    树视图可以用于表示数据的层次. 例如:SAP CRM中的组织结构数据可以表示为树视图. 在SAP CRM Web UI的术语当中,没有像表视图(table view)或者表单视图(form view) ...

  8. Android开发学习—— Fragment

    #Fragment* 用途:在一个Activity里切换界面,切换界面时只切换Fragment里面的内容* 生命周期方法跟Activity一致,可以理解把其为就是一个Activity* 定义布局文件作 ...

  9. Harmonic Number(调和级数+欧拉常数)

    题意:求f(n)=1/1+1/2+1/3+1/4-1/n   (1 ≤ n ≤ 108).,精确到10-8    (原题在文末) 知识点:      调和级数(即f(n))至今没有一个完全正确的公式, ...

  10. ASP.NET Aries 3.0发布(附带通用API设计及基本教程介绍)

    主要更新: 1:升级处理机制(js请求由同步变更为异步) 2:优化前端JS:包括API和配置方式. 3:增加InputDialog功能. 4:增远远程验证功能. 5:优化权限安全机制. 6:增加一次请 ...