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机制——单线程处理多任务相关推荐
- android获取按键键值,android中按键的扫描码和键值
kernel中的按键驱动通过input子系统上报的键值叫做扫描码(ScanCode),对应头文件在 kernel/include/uapi/linux/input.h andorid中的用到的按键才叫 ...
- sendevent/getevent模拟Power键
1.显示event设备 # getevent -t add device 1: /dev/input/event6name: "rk29-keypad" add device 2: ...
- Android 禁用电源键音量键与模拟
/base/services/core/java/com/android/server/policy/PhoneWindowManager.java 模拟 在PhoneWindowManager中注册 ...
- android怎么模拟返回,Android中障蔽返回键,HOME键以及模拟HOME键返回效果的方法...
Android中屏蔽返回键,HOME键以及模拟HOME键返回效果的方法 在Android开发中,有时需要屏蔽一些实体的按键,如HOME键,返回键等实体的按键,实现的方法如下. 1. 屏蔽实体按键 屏蔽 ...
- android模拟器 后退键,MainActivity返回键模拟home效果,容易出现的问题
很多app都会将返回键模拟成home效果,代码如下: @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (key ...
- 【Android】模拟返回键、菜单键、Home键
Android 如何模拟返回键.菜单键.主页键? 如果有一个悬浮窗,运行所有程序的时候都能够看到,我希望点击悬浮窗就模拟返回键的功能,不管我现在运行的是什么程序,这个如何实现? 方法一: Runtim ...
- Android 再按一次退出程序(模拟Home键退出)
Android项目中退出程序的方式有多种多样,但是基本的思想大致分为两种:1.通过finish()方法直接退出程序:2.模拟Home键操作退出程序. 如果使用第一种方式finish()方法直接退出程序 ...
- Android应用模拟返回键、home键
模拟返回键 Runtime runtime = Runtime.getRuntime();runtime.exec("input keyevent " + KeyEvent.KEY ...
- android 模拟返回键
//模拟返回键 相关于ADB方式 有时会无效 try { Runtime runtime = Runtime.getRuntime(); runtime.exec("input keyeve ...
最新文章
- 彻底关闭windows server 2008 IPv6
- php开发支付宝支付密码忘记了怎么办_密码箱忘记密码怎么办?密码箱解锁方法大全...
- js防篡改对象之冻结对象
- 预安装CentOS6.5,虚拟机VMware Workstation12配置
- Java中类方法的快速入门
- ##API(一)————枚举
- 怎么将多张图片合成一个pdf文件
- 每日一算法:杨辉三角形
- golang源代码阅读,sync系列-WaitGroup
- arcgis地理空间数据库学习记录05-管理分布式数据库
- maya cmds 笔记_1
- 《物流与供应链管理》读书笔记
- uni-app的editor的富文本编辑器
- ios 图像坐标系_[译] iOS 开源图形库 Core Plot 使用教程
- Android移动开发-AndroidStudio调试安装时出现“Error running app: Default Activity Not Found”报错的解决方案
- vue2源码解读笔记(一)
- 学员洒泪分享,中富金石投顾骗局?血本无归?
- android的ui模板,11免费好看的手机APP UI模板
- python 多态app_python 多态
- MindSpore联邦学习框架解决行业级难题
热门文章
- 自然语言处理python进阶(一)
- android跑步软件,手机跑步软件哪个好_安卓手机跑步记录软件_手机跑步app【最新】-太平洋电脑网...
- 百万大数据架构师学习笔记
- 从知识图谱到文本:结合局部和全局图信息生成更高质量的文本
- 从“猿”到“金刚”,机器学习让你在职业生涯超进化!
- POJ 1410 Intersection 判断线段交和点在矩形内 【计算几何】
- pytorch学习之路
- centos安装mysql密码_centos 安装mysql并设置密码
- 一行文章让你搞懂什么是前缀、中缀、后缀表达式以及它们之间的相互转换
- dreamstart的催促