android模拟多任务键,模拟Android Handler机制——单线程处理多任务
消息類(Message):
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 messages = new ArrayList();
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 local = new ThreadLocal();
/**
* 消息入隊
* @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 Handler机制——单线程处理多任务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为畅享9s可以升级鸿蒙吗,珍珠全面屏!
- 下一篇: html文档定义层标记是,HTML文档定