模拟android Handler线程间通信
来源:互联网 发布:c语言入门基础知识 编辑:程序博客网 时间:2024/06/13 02:26
消息类:
package p;public class Message {Runnable runnable;private long start;long delay;Handler target;public int arg;public Message(Handler target) {this.target = target;start = System.currentTimeMillis();}boolean canHandle() {return delay <= System.currentTimeMillis() - start;}}消息队列类:
package p;import java.util.ArrayList;import java.util.List;public class MessageQueue {private List<Message> messages = new ArrayList<Message>();private int cursor = -1;/** * 入队 * * @param message */public void push(Message message) {messages.add(message);}/** * 移出队列 * * @param message */public void remove(Message message) {messages.remove(message);cursor--;}/** * 出队 * * @return */public Message pop() {Message message = null;if (!messages.isEmpty()) {message = messages.get(++cursor);if (cursor == messages.size() - 1) {cursor = -1;}}return message;}}
Handler类:
package p;public class Handler {private MessageQueue queue;public Handler() {queue = MessageManager.getMessageQueue();if (queue == null) {throw new RuntimeException("创建Handler之前必须必须调用MessageManager.prepare()");}}/** * 接收消息,子类去实现 * * @param message */public void handleMessage(Message message) {}/** * 发送消息 * * @param message * @param delay */public void sendMessage(Message message, long delay) {message.delay = delay;queue.push(message);}/** * 发送任务 * * @param runnable * @param delay */public void post(Runnable runnable, long delay) {Message message = convertToMessage(runnable);message.delay = delay;queue.push(message);}/** * 将任务转化为消息 * * @param runnable * @return */private Message convertToMessage(Runnable runnable) {Message message = new Message(this);message.runnable = runnable;return message;}/** * 分派消息 * * @param message */void dispatchMessage(Message message) {if (message.runnable != null) {message.runnable.run();} else {handleMessage(message);}}}消息管理类:
package p;public class MessageManager {private static ThreadLocal<MessageQueue> local = new ThreadLocal<MessageQueue>();/** * 获取消息队列 * * @return */public static MessageQueue getMessageQueue() {return local.get();}/** * 创建消息队列 */public static void prepare() {MessageQueue queue = local.get();if (queue != null) {throw new RuntimeException("每个线程只能有一个消息队列!");}local.set(new MessageQueue());}/** * 开启消息循环 */public static void loop() {MessageQueue messageQueue = local.get();Message message;while (true) {if ((message = messageQueue.pop()) != null) {if (message.canHandle()) {messageQueue.remove(message);message.target.dispatchMessage(message);}}}}}模拟activity以及启动:
package p.client;import p.Handler;import p.Message;import p.MessageManager;public class UI2 {private Handler handler;public void onCreate() {System.out.println("onCreate:" + Thread.currentThread().getName());handler = new Handler() {@Overridepublic void handleMessage(Message message) {System.out.println("handleMessage:"+ Thread.currentThread().getName());System.out.println(message.arg);}};new Thread(new Runnable() {@Overridepublic void run() {try {Thread.sleep(3000);System.out.println("sendMessage:"+ Thread.currentThread().getName());} catch (InterruptedException e) {e.printStackTrace();}Message message = new Message(handler);message.arg = 10;handler.sendMessage(message, 3000);}}).start();System.out.println("End onCreate!");}public static void main(String[] args) {Runnable runnable = new Runnable() {@Overridepublic void run() {MessageManager.prepare();UI2 mainUI = new UI2();mainUI.onCreate();MessageManager.loop();}};Thread main = new Thread(runnable);main.setName("main");main.start();}}输出:
onCreate:mainEnd onCreate!sendMessage:Thread-1handleMessage:main10
0 0
- 模拟android Handler线程间通信
- Android线程间通信--Handler
- Android 线程间通信------handler
- Android线程通信(Handler)
- android利用handler线程间的通信
- Android线程间通信机制(Handler Looper )
- Android线程间通信机制(Handler Looper )
- 【Android】Handler之线程间通信
- Android线程间通信方式:Handler Looper
- Android线程间通信(四):Handler
- Android handler实现线程间通信
- android handler,looper子线程间通信
- Android线程间通信之Handler
- Android线程间通信 Handler、Looper、MessageQueue
- android线程间通信之handler
- android 线程通信Handler Bundle
- android Handler UI线程&后台线程通信
- android Handler UI线程&后台线程通信
- 华为面试题——一道关于指针方面的编程题(C/C++)
- 进程与线程
- java设计模式之命令模式
- 每日linux命令学习之du df
- Boost多线程编程
- 模拟android Handler线程间通信
- jquery JSON的解析方式
- 马士兵struts2视频教程第二十集
- 分公司电脑通过大手笔投入
- 配置Action(一)——包和命名空间
- JavaSe基础XX11——面向对象——[内部类]
- C语言string.h中常用函数详解
- 分公司电脑通过大手笔投入
- 分公司电脑通过大手笔投入