消息类(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机制——单线程处理多任务相关推荐

  1. android获取按键键值,android中按键的扫描码和键值

    kernel中的按键驱动通过input子系统上报的键值叫做扫描码(ScanCode),对应头文件在 kernel/include/uapi/linux/input.h andorid中的用到的按键才叫 ...

  2. sendevent/getevent模拟Power键

    1.显示event设备 # getevent -t add device 1: /dev/input/event6name: "rk29-keypad" add device 2: ...

  3. Android 禁用电源键音量键与模拟

    /base/services/core/java/com/android/server/policy/PhoneWindowManager.java 模拟 在PhoneWindowManager中注册 ...

  4. android怎么模拟返回,Android中障蔽返回键,HOME键以及模拟HOME键返回效果的方法...

    Android中屏蔽返回键,HOME键以及模拟HOME键返回效果的方法 在Android开发中,有时需要屏蔽一些实体的按键,如HOME键,返回键等实体的按键,实现的方法如下. 1. 屏蔽实体按键 屏蔽 ...

  5. android模拟器 后退键,MainActivity返回键模拟home效果,容易出现的问题

    很多app都会将返回键模拟成home效果,代码如下: @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (key ...

  6. 【Android】模拟返回键、菜单键、Home键

    Android 如何模拟返回键.菜单键.主页键? 如果有一个悬浮窗,运行所有程序的时候都能够看到,我希望点击悬浮窗就模拟返回键的功能,不管我现在运行的是什么程序,这个如何实现? 方法一: Runtim ...

  7. Android 再按一次退出程序(模拟Home键退出)

    Android项目中退出程序的方式有多种多样,但是基本的思想大致分为两种:1.通过finish()方法直接退出程序:2.模拟Home键操作退出程序. 如果使用第一种方式finish()方法直接退出程序 ...

  8. Android应用模拟返回键、home键

    模拟返回键 Runtime runtime = Runtime.getRuntime();runtime.exec("input keyevent " + KeyEvent.KEY ...

  9. android 模拟返回键

    //模拟返回键 相关于ADB方式 有时会无效 try { Runtime runtime = Runtime.getRuntime(); runtime.exec("input keyeve ...

最新文章

  1. 彻底关闭windows server 2008 IPv6
  2. php开发支付宝支付密码忘记了怎么办_密码箱忘记密码怎么办?密码箱解锁方法大全...
  3. js防篡改对象之冻结对象
  4. 预安装CentOS6.5,虚拟机VMware Workstation12配置
  5. Java中类方法的快速入门
  6. ##API(一)————枚举
  7. 怎么将多张图片合成一个pdf文件
  8. 每日一算法:杨辉三角形
  9. golang源代码阅读,sync系列-WaitGroup
  10. arcgis地理空间数据库学习记录05-管理分布式数据库
  11. maya cmds 笔记_1
  12. 《物流与供应链管理》读书笔记
  13. uni-app的editor的富文本编辑器
  14. ios 图像坐标系_[译] iOS 开源图形库 Core Plot 使用教程
  15. Android移动开发-AndroidStudio调试安装时出现“Error running app: Default Activity Not Found”报错的解决方案
  16. vue2源码解读笔记(一)
  17. 学员洒泪分享,中富金石投顾骗局?血本无归?
  18. android的ui模板,11免费好看的手机APP UI模板
  19. python 多态app_python 多态
  20. MindSpore联邦学习框架解决行业级难题

热门文章

  1. 自然语言处理python进阶(一)
  2. android跑步软件,手机跑步软件哪个好_安卓手机跑步记录软件_手机跑步app【最新】-太平洋电脑网...
  3. 百万大数据架构师学习笔记
  4. 从知识图谱到文本:结合局部和全局图信息生成更高质量的文本
  5. 从“猿”到“金刚”,机器学习让你在职业生涯超进化!
  6. POJ 1410 Intersection 判断线段交和点在矩形内 【计算几何】
  7. pytorch学习之路
  8. centos安装mysql密码_centos 安装mysql并设置密码
  9. 一行文章让你搞懂什么是前缀、中缀、后缀表达式以及它们之间的相互转换
  10. dreamstart的催促