Android多线程——异步消息处理机制

Android中的异步消息处理机制主要由四个部分组成,Message、Handler、MessageQueueh和Looper。这里先简要介绍一下四个部分。

  1.Message

  Message是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间交换数据,Message可以使用what、arg1和arg2字段来携带一些整形数据、使用obj来携带一个Object对象。

  2.Handler

  Handler是处理者的意思,主要用于发送和处理消息。发送消息一般是使用Handler的sendMessage()方法,而发出的消息经过一系列地辗转处理之后,最终会传递到Handler的handleMessage()方法中。

  3.MessageQueue

  MessageQueue是消息队列的意思,它主要用于存放所有通过Handler发送的消息,这部分消息会一直存在于消息队列中,等待被处理,每个线程中只会有一个MessageQueue对象。

  4.Looper

  Looper是每个线程中的MessageQueue 的管家,调用Looper的loop()方法后,会进入到一个无限循环当中,然后每当发现MessageQueue中存在一条消息,就会将它取出,并传递到Handler的handleMessage()方法中,每个线程中也只会有一个Looper对象。

异步消息处理机制流程

  android异步消息处理的机制也就是首先在主线程中创建一个handler对象,并重写handleMessage()方法。

 1 public class MainActivity extends Activity {
 2
 3     @Override
 4     protected void onCreate(Bundle savedInstanceState) {
 5         super.onCreate(savedInstanceState);
 6         setContentView(R.layout.activity_main);
 7
 8         if (savedInstanceState == null) {
 9             getFragmentManager().beginTransaction()
10                     .add(R.id.container, new PlaceholderFragment()).commit();
11         }
12     }
13
14     public void onStart() {
15         super.onStart();
16
17         TextView tv = (TextView) this.findViewById(R.id.textView1);
18
19         Button btn = (Button) this.findViewById(R.id.clickBtn);
20
21         //创建一个handler对象
22         CounterHandler handler = new CounterHandler(tv);
23
24         ClickListener cl = new ClickListener(handler);
25
26         btn.setOnClickListener(cl);
27     }
28
29     @Override
30     public boolean onCreateOptionsMenu(Menu menu) {
31
32         // Inflate the menu; this adds items to the action bar if it is present.
33         getMenuInflater().inflate(R.menu.main, menu);
34         return true;
35     }
36
37     @Override
38     public boolean onOptionsItemSelected(MenuItem item) {
39         // Handle action bar item clicks here. The action bar will
40         // automatically handle clicks on the Home/Up button, so long
41         // as you specify a parent activity in AndroidManifest.xml.
42         int id = item.getItemId();
43         if (id == R.id.action_settings) {
44             return true;
45         }
46         return super.onOptionsItemSelected(item);
47     }
48
49     /**
50      * A placeholder fragment containing a simple view.
51      */
52     public static class PlaceholderFragment extends Fragment {
53
54         public PlaceholderFragment() {
55         }
56
57         @Override
58         public View onCreateView(LayoutInflater inflater, ViewGroup container,
59                 Bundle savedInstanceState) {
60             View rootView = inflater.inflate(R.layout.fragment_main, container,
61                     false);
62             return rootView;
63         }
64     }
65
66 }

  然后当子线程中需要进行更新UI操作是,就创建一个Message对象,通过handler对象的sendMessage()方法将消息发送出去,之后这条消息会被添加到MessageQueue的队列中等待被处理,而Looper则会一直尝试从MessageQueue中取出待处理的消息,最后分发回Handler的handleMessage()方法中。

 1 //handler类
 2 public class CounterHandler  extends Handler{
 3      TextView tv;
 4
 5      CounterHandler(TextView tv){
 6          this.tv = tv;
 7      }
 8     //处理消息
 9     public void handleMessage(Message msg) {
10        System.out.println("收到一条消息"+msg.obj);
11        tv.setText((String)msg.obj);
12      }
13 }
 1 //子线程
 2 public class Counter implements Runnable{
 3     Handler handler;
 4
 5     Counter(Handler handler){
 6         this.handler = handler;
 7     }
 8
 9     public void run() {
10         int i=0;
11         while(i<100){
12             i++;
13             System.out.println(i);
14             //显示到TextView上
15
16             //创建Message
17             Message msg = new Message();
18             msg.obj="count:"+i;
19             //通过handletr发送消息
20             handler.sendMessage(msg);
21
22             try {
23                 Thread.sleep(1000);
24             } catch (InterruptedException e) {
25                 // TODO Auto-generated catch block
26                 e.printStackTrace();
27             }
28
29         }
30
31     }
32
33 }
 1 //事件监听器
 2 public class ClickListener implements OnClickListener{
 3     Handler handler;
 4
 5     ClickListener(Handler handler){
 6         this.handler = handler;
 7     }
 8
 9
10     @Override
11     public void onClick(View v) {
12         Counter counter = new Counter(handler);
13         new Thread(counter).start();
14
15     }
16
17 }

  由于Handler是在主线程中创建的,所以此时handleMessage()方法也会在主线程中运行,于是我们在这里就可以安心的进行UI操作,这就是android多线程的异步消息处理机制。

时间: 2024-10-27 18:53:36

Android多线程——异步消息处理机制的相关文章

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

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

Android Handler 异步消息处理机制的妙用 创建强大的图片加载类

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38476887 ,本文出自[张鸿洋的博客] 最近创建了一个群,方便大家交流,群号:55032675 上一篇博客介绍了Android异步消息处理机制,如果你还不了解,可以看:Android 异步消息处理机制 让你深入理解 Looper.Handler.Message三者关系 .那篇博客的最后,提出可以把异步消息处理机制不仅仅是在MainActivity中更新UI,可以用到别的地方,

Android Handler 异步消息处理机制的妙用 创建强大的图片载入类

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38476887 ,本文出自[张鸿洋的博客] 近期创建了一个群.方便大家交流,群号:55032675 上一篇博客介绍了Android异步消息处理机制.假设你还不了解,能够看:Android 异步消息处理机制 让你深入理解 Looper.Handler.Message三者关系 . 那篇博客的最后,提出能够把异步消息处理机制不仅仅是在MainActivity中更新UI.能够用到别的地方

Android中异步消息处理机制

1. Thread Local Storage (线程局部存储)      我们通过位于android.os包下的Looper.class源码可以看到成员变量区有一个线程局部变量sThreadLocal,该类的作用是线程局部存储?那么是线程局部存储TLS?这个问题可以从变量作用域的角度来理解. 变量的常见作用域一般包括以下几种. 函数内部变量.其作用区域是该函数,即每次调用该函数,该变量都会重新回到初始值. 类内部的变量.其作用就是该类所产生的对象,即只要该对象没有被销毁,则对象内部的变量则一直

Android Learning:多线程与异步消息处理机制

在最近学习Android项目源码的过程中,遇到了很多多线程以及异步消息处理的机制.由于之前对这块的知识只是浅尝辄止,并没有系统的理解.但是工程中反复出现让我意识到这个知识的重要性.所以我整理出这篇博客,主要介绍了线程和异步处理机制的意义和用法,目的在于帮助初学者能够加深对异步消息处理机制的理解,在实际Android工程中能够更多地使用AsyncTask工具类在子线程中进行UI更新. 一.Android当中的多线程[1] 在Android当中,当一个应用程序的组件启动的时候,并且没有其他的应用程序

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

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

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以及先进先出的原则取出该消息并处理消息,所以

Android 异步消息处理机制

转载自博客:http://blog.csdn.net/lmj623565791/article/details/38377229/ 1. 概述 Handler . Looper .Message 这三者都与Android异步消息处理线程相关的概念.那么什么叫异步消息处理线程呢?异步消息处理线程启动后会进入一个无限的循环体之中,每循环一次,从其内部的消息队列中取出一个消息,然后回调相应的消息处理函数,执行完成一个消息后则继续循环.若消息队列为空,线程则会阻塞等待. 说了这一堆,那么和Handler