最近项目中遇到将android project转成java project的需求,要把项目中android相关的部分去掉。其中最纠结的就是如何替换handler。
handler多用于指定线程(Looper)上执行回调,还可以当成一个消息队列使用。通过sendMessageDelayed
可以做到事件的延时执行、条件执行和去抖(debouncing)。
于是,我利用Java里面的ScheduledExecutorService
写了一个简单的Handler,接口与原Handler基本一致,代码如下所示: Message类: <script src="https://gist.github.com/legendmohe/8ea6c3b6fa8d09312c75aeb542e2e10c.js"></script> Looper类: <script src="https://gist.github.com/legendmohe/260a22279151c111108312c8efd24907.js"></script> Handler类: <script src="https://gist.github.com/legendmohe/c6135378ea7e4c0ff38e5c28e8d558f9.js"></script> 使用方法如下所示:public class ExampleUnitTest { private static final String TAG = "ExampleUnitTest"; @Test public void handlerTest() throws Exception { final long startTime = System.currentTimeMillis(); println(TAG, "startTime: " + startTime); Handler handler = new Handler() { @Override public void handleMessage(Message msg) { println(TAG, " - " + (System.currentTimeMillis() - startTime)); println(TAG, "handleMessage: " + msg); } }; for (int i = 50000; i >= 0; i--) { Message msg = Message.newMessage(); msg.what = new Random().nextInt(10); msg.obj = i; handler.sendMessageDelayed(msg, 60 * 100); } Thread.sleep(5 * 1000); handler.removeMessages(5); Thread.sleep(600 * 1000); } public void println(String tag, String msg) { System.out.println("[" + tag + "] " + msg); } }
查看原文:http://legendmohe.net/2017/07/12/java-%e4%b8%80%e4%b8%aa%e4%b8%8d%e4%be%9d%e8%b5%96android%e7%8e%af%e5%a2%83%e7%9a%84handler/
[Java] 一个不依赖Android环境的Handler
最新推荐文章于 2022-06-16 12:00:22 发布