了解Windows编程的朋友可能知道Windows程序是消息驱动的,同样Android应用程序也是消息驱动的。Android通过Looper、Handler来实现消息循环机

制,Android消息循环是针对线程的(每个线程都可以有自己的消息队列和消息循环)。
下面根据如下列子来开始进行Android消息处理系统的分析。
package com.XXX;

import android.app.Activity;
import android.os.Bundle;
import android.os.Message;
import android.util.Log;
import android.os.Handler;

public class MyHandler extends Activity {
static final String TAG = "Handler";
Handler h = new Handler(){
public void handleMessage (Message msg)
{
switch(msg.what)
{
case HANDLER_TEST:
Log.d(TAG, "Hanle Message in the handler thread, id = " + Thread.currentThread().getId() + "/n");
break;
}
}
};

static final int HANDLER_TEST = 1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "The main thread id = " + Thread.currentThread().getId() + "/n");

new myThread().start();
setContentView(R.layout.main);
}

class myThread extends Thread
{
public void run()
{
Message msg = new Message();
msg.what = HANDLER_TEST;
h.sendMessage(msg);
Log.d(TAG, "The worker thread id = " + Thread.currentThread().getId() + "/n");
}
}
}
运行结果如下:
The main thread id = 1
The worker thread id = 8
Hanle Message in the handler thread, id = 1
我们知道Activity是一个UI线程,运行于主线程中,Android系统在启动的时候会为Activity创建一个消息队列和消息循环(Looper)。
MyHandler中Handler h = new Handler()。根据Handler.java中Handle()实现,
public Handle(){
......
mLooper = Looper.myLooper();
......
mQueue = mLooper.mQueue;
mCallback = null;
}
new Handler()得到了当前线程的Looper对象,以及对应的消息对列。一般情况下,想让线程具有消息队列和消息循环,需要在线程中首先调用Looper.prepare()来创建消息队列,然后调用Looper.loop()进入消息循环。
从Looper.java可知, prepare()创建一个new Looper,而loop()进入消息循环。
public static final void loop(){
Looper me = myLooper();
MessageQueue queue = me.mQueue;
while(true){
Message msg = queue.next();
msg.target.dispatchMessage(msg);
}
}
而msg.target对象为Handler。Handler的dispatchMessage()将最终调用handleMessage(),如下:
public void dispatchMessage(Message msg){
if(msg.callback!=null)
{
handleCallback(msg);
}else{
......
handleMessage(msg);
......
}
}
我们从运行的结果可以看出,msg.target实际上就是此处Handler。原因在工作线程myThread的
h.sendMessage(msg);
sendMessage()依次调用sendMessageDelayed(), sendMessageAtTime()。
在sendMessageAtTime中有msg.target = this。
所以发送的消息,能被正确接收处理。Android中很多情况都使用了这种特性,熟悉Android消息处理机制对应用开发非常重要。

参考资料

http://my.unix-center.net/~Simon_fu/?p=652

更多相关文章

  1. Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面
  2. 享受Android应用程序的Java技术盛宴
  3. Android(安卓)UI线程和非UI线程
  4. Android(安卓)系统中WatchDog 日志分析
  5. 转:Android(安卓)AsyncTask
  6. Android面试系列文章2018之Android部分Handler机制篇
  7. 享受Android应用程序的Java技术盛宴
  8. Android面试系列文章2018之Android部分Handler机制篇
  9. Android之 UI主线程

随机推荐

  1. Android,TextVIew单行加省略号 ...对比较
  2. Android使用本地svg及不显示问题解决
  3. Android基础和运行机制
  4. Android(安卓)中文 API (100) —— Scrol
  5. Android受手机制造商青睐 业内担心埋下隐
  6. 【译】Android中的安全数据— Android中
  7. android 与JS之间的交互
  8. Android中的Handler在多线程中的使用
  9. 如何搭建android的开发环境 虚拟机和ubun
  10. 【移动开发】Android中WIFI开发总结(一)