日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

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

發布時間:2024/9/30 Android 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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机制——单线程处理多任务的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。