Android 中的消息模型(Message,MessageQueue,handle,looper)

Android 中的消息模型(Message,MessageQueue,handle,looper,)

Android 中的消息通讯

1.Android 中线程的应用机制?

1)Android 中所有的耗时操作应在工作线程执行。

2)Android 中所有的UI操作应该在主线程(UI线程)执行。

FAQ?

1)主线程执行执行耗时操作好吗? 不好,这样会阻塞UI操作。

2)工作执行完耗时操作,假如有数据要传递给主线程,那如何实现?

2.Android 中多线程应用时的消息模型?

使用Android中消息模型的目的是尽量不要去阻塞

主线程,然后给用户一种比较友好的体验。

Android 中消息模型关注对象:

1)Message :数据的载体

2)MessageQueue: 存储多个消息对象

3)Looper:迭代消息队列,取出消息。

4)Handler:发送,处理消息队列中的消息。

Android中消息模型关注对象伪代码实现:

class Message{

Object obj;数据

int what; 数据要用于做什么

.....

}

class MessageQueue{

Object[] message=new Object[5];

public void put(Message msg){}

public Message tabke(){}

}

class Looper{

private MessageQueue msgQ;

public void loop(){

while(true){....}

}

}

class Handler{

public void sendMessage(Message msg){}

public void handleMessage(Message msg){}

}

3.Android 中消息模型应用案例?

1)工作线程发消息给主线程?

2)主线程发消息给主线程?

3)主线程发消息给工作线程?

记住:

1)主线程在启动时已经默认创建了Looper和消息队列对象

2)给谁发消息就让handler关联谁的Looper.

3)handler的handleMessage方法运行在哪个线程由handler

关联的looper而定。

4.Android 中消息模型对象相关方法总结?

1)Message

数据的载体

(obj数据,

what数据要用于做什么,

obtain()获得一个消息,....)

2)MessageQueue存储多个消息对象

3)Looper(prepare()创建一个looper,并绑定到当前线程,

myLooper()获得当前线程Looper,

loop(),

getMainLooper()默认关联当前线程looper,

quit())

4)Handler(sendMessage消息发送给谁,取决于handler关联的looper,

handleMessage可以执行消息的处理操作,sendXXXXX)

1主线程给主线程发消息

1、通过主线程给主线程发消息

 消息的分类:系统消息、用户自定义消息

 主线程中发消息要借助主线程Handler对象。

|-->当我们发送自定义消息时,Handler需要我们自己构建。

|-->一个线程可能关联很多个handler对象

 主线程发送的消息会存储在主线程的MQ中。

 主线程中的消息队列的管理者是主线程的Looper。

|-->此Looper内置一个阻塞式无限循环。

|-->此循环的目的是遍历和Looper相关联的MQ对象

|-->此Looper负责从MQ中获取消息,并将消息交给Handler。

FAQ:

1)主线程的Looper对象何时创建?系统启动时

此Looper对象创建以后会绑定到当前线程中(借助ThreadLocal)

2)主线程中的MQ何时创建?Looper对象创建时,MQ自动创建。

3)MQ自定义消息何时创建?如何创建?

|-->需要时创建。

|-->创建方法?

Message msg=Message.obtain();

Message msg=handler.obtainMessage();

4)主线程中的Handler对象何时创建?

|-->需要时创建。

|-->创建方式?

匿名内部类:new Handler(){重写HandleMessage方法}

构建handler子类

2 子线程给主线程发送消息

方案:在子线程中获取主线程的Handler对象

如何获取:

在主线程构建Handler对象。

在子线程中构建主线程Handler对象??

handler=new Handler(Looper.getMainLooper());

3 子线程如何创建Looper对象

1、子线程中创建Looper的理由?

 子线程中默认没有Looper对象

 子线程中需要使用子线程的handler对象发送消息

2、子线程创建Looper的方式?创建Looper时自动构建MQ

Looper.prepare();//构建过程?先从当前线程取,若无则创建。创建后绑定到当前线程。

...构建handler

Looper.loop();

FAQ:

a. 子线程的handler构建时需要子线程的Looper

b. 子线程的Handler对象发送消息是发送到子线程的MQ

c. 子线程在处理消息时不能更新主线程界面。

4 主线程如何获取子线程的Handler对象

方案:设法在主线程中获取子线程的Looper对象。

时间: 2024-08-14 08:31:37

Android 中的消息模型(Message,MessageQueue,handle,looper)的相关文章

Android的消息机制以及Message/MessageQueue/Handler/Looper

概览 * Message:消息.消息里面可包含简单数据.Object和Bundle,还可以包含一个Runnable(实际上可看做回调). * MessageQueue:消息队列,供Looper线程消费消息. * Looper:用于循环处理Message,一个Thread结合一个Looper来实现消息循环处理.Android App的主线程包含了Looper. * Handler:负责向当前Looper线程发送Message,并实现如何处理消息的回调,回调可放到Callback接口的实现中,也可以

深入解析Android中Handler消息机制

Android提供了Handler 和 Looper 来满足线程间的通信.Handler先进先出原则.Looper类用来管理特定线程内对象之间的消息交换(MessageExchange).Handler消息机制可以说是Android系统中最重要部分之一,所以,本篇博客我们就来深入解析Android中Handler消息机制. Handler的简单使用 为什么系统不允许子线程更新UI 因为的UI控件不是线程安全的. 如果在多线程中并发访问可能会导致UI控件处于不可预期的状态,那为什么不对UI控件的访

Android中的消息机制

在分析Android消息机制之前.我们先来看一段代码: public class MainActivity extends Activity implements View.OnClickListener { private TextView stateText; private Button btn; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); s

浅析Android中的消息机制(转)

原博客地址:http://blog.csdn.net/liuhe688/article/details/6407225 在分析Android消息机制之前,我们先来看一段代码: 1 public class MainActivity extends Activity implements View.OnClickListener { 2 private TextView stateText; 3 private Button btn; 4 5 @Override 6 public void onC

浅析Android中的消息机制-解决:Only the original thread that created a view hierarchy can touch its views.

在分析Android消息机制之前,我们先来看一段代码: [html] view plaincopyprint? public class MainActivity extends Activity implements View.OnClickListener { private TextView stateText; private Button btn; @Override public void onCreate(Bundle savedInstanceState) { super.onC

浅析Android中的消息机制(转)

在分析Android消息机制之前,我们先来看一段代码: public class MainActivity extends Activity implements View.OnClickListener { private TextView stateText; private Button btn; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); s

Android中的消息通知Toast和Notification

Android中的消息通知Toast和Notification 1.弹出通知Toast MainActivity.java 1 package com.example.toast; 2 3 import android.os.Bundle; 4 import android.app.Activity; 5 import android.view.Gravity; 6 import android.view.Menu; 7 import android.view.View; 8 import an

谈谈我对Android中的消息机制的理解之Handler,Looper和MessageQueue的解释

Handler的作用是:发送Message和处理Message,handler发送的Message其实就是发送给自己的对象进行处理,所以谁发送就是谁处理,但是这个绝对有意义,以为这样我们就可以通过Handler将消息的处理从一个线程转到另一个线程了,这个Message几经转手之后,处理它的对象虽然是同一个,但是处理它的线程就变了,变成了创建Handler对象的线程,而不是产生Message对象的线程(当然,这个两个线程可能是一个,但是这样使用handler就是第二个目的了),使用handler的

Android中对消息机制(Handler)的再次解读

今天遇到一些关于在子线程中操作Handler的问题,感觉又要研究源代码了,但是关于Handler的话,我之前研究过,可以参考这篇文章:http://blog.csdn.net/jiangwei0910410003/article/details/17021809.但是这篇文章没有说的那么深入了,所以这次就更深入的解读一下. 摘要 Android中的应用程序都是通过消息驱动的,系统为每一个应用程序维护一个消息队列(MessageQueue),应用程序的主线程不断的从这个消息队列中获取消息(Loop