模拟Android Handler机制——单线程处理多任务
2014-08-10 15:52
323 查看
消息类(Message):
每个线程拥有一个消息队列。
消息管理类(MessageManager):
模拟handler类(Handler):
模拟activity的类(MainUI):
package p; public class Message { private Runnable runnable; private long start; private long delay; public Message(Runnable runnable, long delay) { start = System.currentTimeMillis(); this.runnable = runnable; this.delay = delay; } public void handle() { runnable.run(); } public boolean canHandle() { return delay <= System.currentTimeMillis() - start; } }消息队列(MessageQueue):
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; } }
每个线程拥有一个消息队列。
消息管理类(MessageManager):
package p; public class MessageManager { private static ThreadLocal<MessageQueue> local = new ThreadLocal<MessageQueue>(); /** * 消息入队 * @param message */ public static void addMessage(Message message) { local.get().push(message); } /** * 创建消息队列 */ 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 ((message = messageQueue.pop()) != null) { if (message.canHandle()) { messageQueue.remove(message); message.handle(); } } } }
模拟handler类(Handler):
package p; public class Handler { public void post(Runnable runnable, long delay) { Message message = new Message(runnable, delay); MessageManager.addMessage(message); } }
模拟activity的类(MainUI):
package p; public class MainUI { public void onCreate() { System.out.println("onCreate:" + Thread.currentThread().getName()); new Handler().post(new Runnable() { @Override public void run() { System.out.println("post after 3 minutes:" + Thread.currentThread().getName()); } }, 3000); new Handler().post(new Runnable() { @Override public void run() { System.out.println("post after 6 minutes:" + Thread.currentThread().getName()); } }, 6000); new Thread(new Runnable() { @Override public void run() { MessageManager.prepare(); new Handler().post(new Runnable() { @Override public void run() { System.out.println("post after 9 minutes:" + Thread.currentThread().getName()); } }, 9000); new Handler().post(new Runnable() { @Override public void run() { System.out.println("post after 12 minutes:" + Thread.currentThread().getName()); } }, 12000); MessageManager.loop(); } }).start(); System.out.println("End onCreate!"); } }模拟android启动activity的类(Main):
package p; public class Main { public static void main(String[] args) { Runnable runnable = new Runnable() { @Override public void run() { MessageManager.prepare(); MainUI mainUI = new MainUI(); mainUI.onCreate(); MessageManager.loop(); } }; Thread main = new Thread(runnable); main.setName("main"); main.start(); } }执行输出:
onCreate:main End onCreate! post after 3 minutes:main post after 6 minutes:main post after 9 minutes:Thread-1 post after 12 minutes:Thread-1
相关文章推荐
- Android 任务和回退堆栈---处理亲缘关系
- android长按home键源码分析以及模拟长按home事件--弹出近期任务
- linux-android(任务处理)
- Android 跨进程事件处理(一)——模拟点击、全局截屏
- Android-异步任务处理
- 多任务处理之手机系统(iOS,android等)
- android中任务栈的处理方式
- Android 跨进程事件处理(一)——模拟点击、全局截屏
- Android Handler机制 (一个Thead中可以建立多个Hander,通过msg.target保证MessageQueue中的每个msg交由发送message的handler进行处理 ,但是 每个线程中最多只有一个Looper,肯定也就一个MessageQuque)
- Android基础学习之AsyncTask(异步任务处理类)一
- android长按home键源码分析以及模拟长按home事件--弹出近期任务.
- Android 事件处理(含模拟鼠标/按键事件)
- android后台任务处理
- Android事件处理之五 异步任务
- 使用线程池模拟处理耗时任务,通过websocket提高用户体验
- Android 任务和回退堆栈---处理亲缘关系
- 模拟线程池,处理异步任务
- android延时处理任务范例
- (专栏)Android异步任务处理从零开始
- Android基础学习之AsyncTask(异步任务处理类)二