您的位置:首页 > 移动开发 > Android开发

模拟Android Handler机制——单线程处理多任务

2014-08-10 15:52 323 查看
消息类(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<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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: