android消息机制 Message, Looper,Handler
来源:互联网 发布:登录360账号 网络错误 编辑:程序博客网 时间:2024/04/30 18:49
其原理为:消息线程(默认是主线程,也就是UI线程),维护一个消息循环和一个消息队列,工作线程向消息队列中添加消息,消息循环从队列中取出消息并处理。
其中Looper类负责消息循环和消息队列,Message类是消息的载体,Handler类负责消息队列中添加消息和消息的处理。
Looper的prepare接口负责为调用线程创建一个Looper对象,下面是android源码,汉字部分为本文添加的注释:
public static final void prepare() { if (sThreadLocal.get() != null) { //其中sThreadLocal为ThreadLocal对象,不熟悉ThreadLocal的同学可以google下 throw new RuntimeException("Only one Looper may be created per thread"); } sThreadLocal.set(new Looper());}
Looper的loop接口负责开启消息循环:
/** * Run the message queue in this thread. Be sure to call * {@link #quit()} to end the loop. */public static final void loop() { Looper me = myLooper(); MessageQueue queue = me.mQueue;//loop中维护的消息队列 while (true) { Message msg = queue.next(); // 从消息队列中取消息 //if (!me.mRun) { // break; //} if (msg != null) { if (msg.target == null) { // No target is a magic identifier for the quit message. return; } if (me.mLogging!= null) me.mLogging.println( ">>>>> Dispatching to " + msg.target + " " + msg.callback + ": " + msg.what ); msg.target.dispatchMessage(msg); //消息处理 if (me.mLogging!= null) me.mLogging.println( "<<<<< Finished to " + msg.target + " " + msg.callback); msg.recycle(); } }}
Handler中维护一个对Looper对象的引用,并直接获取它的消息队列,以便向消息队列中添加消息:
/** * Default constructor associates this handler with the queue for the * current thread. * * If there isn't one, this handler won't be able to receive messages. */public Handler() { if (FIND_POTENTIAL_LEAKS) { final Class<? extends Handler> klass = getClass(); if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) && (klass.getModifiers() & Modifier.STATIC) == 0) { Log.w(TAG, "The following Handler class should be static or leaks might occur: " + klass.getCanonicalName()); } } mLooper = Looper.myLooper(); //获取线程的Looper对象 if (mLooper == null) { throw new RuntimeException( "Can't create handler inside thread that has not called Looper.prepare()"); } mQueue = mLooper.mQueue; //直接获取Looper对象的消息队列 mCallback = null;}
Looper.loop方法中有一句代码msg.target.dispatchMessage(msg)(见上文)即是调用Handler的dispatchMessage方法:
/** * Handle system messages here. */public void dispatchMessage(Message msg) { if (msg.callback != null) { handleCallback(msg); } else { if (mCallback != null) { if (mCallback.handleMessage(msg)) { return; } } handleMessage(msg); //调用子类的重写方法,故继承Handler时要重写该方法 }}
清楚了消息机制后,就不难理解消息机制的用法了:
MyHandler extends Handler{ public void handleMessage(final Message msg){ switch(msg.what){ case 1: //做一些具体处理,比如说更新UI等 break; } }}MyHandler mHandler=new MyHandler();Message msg = Message.obtain(mHandler,1);msg.sendToTarget();
0 0
- android消息处理机制(Looper,Handler,Message)
- android消息机制 Message, Looper,Handler
- android消息机制:Looper,Handler,Message
- Android消息处理机制--Looper,Handler,Message
- Android 消息机制,Looper、Handler、Message 解析
- Android消息处理机制Message,Looper,Handler
- Android:消息机制(Message,Handler,Looper
- Android消息处理机制Handler、Looper、Message
- Android 消息机制:handler looper message
- Android消息处理机制--Message,Message Queue,Handler,Looper
- Android 异步消息机制 Handler Message Looper机制详解
- [Android源代码分析]Android消息机制,Handler,Message,Looper,MessageQueue
- Android Handler Message Looper 机制
- Android消息处理机制:Handler Thread Message Looper []
- Android消息处理机制:Handler Thread Message Looper
- Android消息处理机制:Handler Thread Message Looper []
- Android消息处理机制:Handler Thread Message Looper
- Android消息处理机制:Handler Thread Message Looper
- QT:在QTableView中使用各种自定义委托
- asp.net显示自己的网页图标
- Lighttpd中发送index.html的流程
- Linux安装telnet服务器
- Power Designer使用技巧
- android消息机制 Message, Looper,Handler
- 关于虚函数,你应该知道的
- linux多线程编程
- javac命令报不是内部或外部命令
- .NET组件程序设计之对象生命周期
- String,StringBuilder与StringBuffer的区别
- 蜗牛—EasyUI学习之初识
- PAT_Basic.Level_1008. 数组元素循环右移问题
- 四个线程写四个文件