Android消息机制使用及详解
2015-10-14 00:16
429 查看
概括
用法
Handler
MessageQueue
Looper
ThreadLocal
用法示例
源码解析
handler
MessageQueue
Looper
ThreadLocal
Handler的创建要求该线程必须具有Looper,如果没有,会报错,主线程默认创建了Looper,再创建,也会报错。要在子线程中创建Handler,需要先创建Looper,即执行:
典型例子:
这三句分别就是
1、在当前线程中创建Looper;
2、在当前线程创建Handler;
3、让当前线程循环监听MessageQueue中是否有新事件,这是一个死循环,后面不能在执行代码。
发送消息:
处理消息:
处理Message的话需要重写Handler.dispatchMessage或者Handler.handleMessage()函数。处理Runnable则不需要重写。
使用过程中重要的两个方法:
1、Looper.prepare(); 该方法在当前线程中创建一个Looper,Looper创建过程中会创建MessageQueue;
2、Looper.loop(); 该方法使线程进入死循环,等待新消息到来;
三个线程中打印的Log分别为:true,false,null;原理后面分析;
用法
Handler
MessageQueue
Looper
ThreadLocal
用法示例
源码解析
handler
MessageQueue
Looper
ThreadLocal
概括
用法
Handler
–Handler:用来发送和处理消息,也就是说,在一个线程中发送,在另一个线程中执行,都是由它来完成的。先讲用法,有兴趣的话可以往后看原理。Handler的创建要求该线程必须具有Looper,如果没有,会报错,主线程默认创建了Looper,再创建,也会报错。要在子线程中创建Handler,需要先创建Looper,即执行:
Looper.prepare();
典型例子:
Looper.prepare(); Handler handler = new Handler(); Looper.loop();
这三句分别就是
1、在当前线程中创建Looper;
2、在当前线程创建Handler;
3、让当前线程循环监听MessageQueue中是否有新事件,这是一个死循环,后面不能在执行代码。
发送消息:
//发送消息 sendMessage(Message msg); sendMessageDelayed(Message msg,long delayMillis); sendMessageAtTime(Message msg,long uptimeMillis); //发送可执行对象 post(Runnable r); postDelayed(); postAtTime(); postAtFrontOfQueue();
处理消息:
处理Message的话需要重写Handler.dispatchMessage或者Handler.handleMessage()函数。处理Runnable则不需要重写。
Looper.prepare(); //主函数中不需要 Handler handler = new Handler(){ @Override //重写其中之一即可 public void dispatchMessage(Message msg) { //事件先经过此函数,然后分发到handleMessage(); super.dispatchMessage(msg); } @Override public void handleMessage(Message msg) { //可以根据msg.what判断要进行什么操作 //比如 switch(msg.what){ case 1: break; case 2: break; } super.handleMessage(msg); } }; Looper.loop(); //主函数中不需要
MessageQueue
用来存储Message,主要包含两个操作,插入和读取(伴随着删除),分别为enqueueMessage和next。因此使用单链表来实现,链表插入和删除当然比较有优势啦。我们在代码中不需要操作,后面详解Looper
Looper:不停地查看MessageQueue中是否有新消息,使用过程中重要的两个方法:
1、Looper.prepare(); 该方法在当前线程中创建一个Looper,Looper创建过程中会创建MessageQueue;
2、Looper.loop(); 该方法使线程进入死循环,等待新消息到来;
ThreadLocal
并不是必须的,但有一些巧妙的作用,ThreadLocal是一个线程内部的数据存储类,每个线程获取到的数据都是自己独有的副本,直接栗子说明,后面详解:private final ThreadLocal<Boolean> mBooleanThreadLocal = new ThreadLocal<>(); mBooleanThreadLocal.set(true); Log.d(TAG, "Thread#main==>mBooleanThreadLocal=" + mBooleanThreadLocal.get()); new Thread(){ @Override public void run() { mBooleanThreadLocal.set(false); Log.d(TAG, "Thread#1==>mBooleanThreadLocal=" + mBooleanThreadLocal.get()); } }.start(); new Thread(){ @Override public void run() { Log.d(TAG, "Thread#2==>mBooleanThreadLocal=" + mBooleanThreadLocal.get()); } }.start();
三个线程中打印的Log分别为:true,false,null;原理后面分析;
用法示例
源码解析
handler
MessageQueue
Looper
ThreadLocal
相关文章推荐
- js继承 Base类的源码解析
- Android开发笔记之:Handler Runnable与Thread的区别详解
- android的消息处理机制(图文+源码分析)―Looper/Handler/Message
- Android中的Looper对象详细介绍
- Android消息处理机制Looper和Handler详解
- AsyncTask陷阱之:Handler,Looper与MessageQueue的详解
- Android中的Handler与多线程应用实例
- android开发教程之handler异步更新ui
- Android定时器和Handler用法实例分析
- Toast和Handler的间隔使用实例
- android开发教程之android的handler使用方法
- Android开发笔记 Handler使用总结
- Android中Handler引起的内存泄露问题解决办法
- Handler与Android多线程详解
- android中的handler
- android定时方法
- Android Looper简介
- Android Handler