Android 线程之自定义带消息循环Looper的实例
程序员文章站
2023-12-09 13:25:03
android 线程之自定义带消息循环looper的实例
android系统的ui线程是一种带消息循环(looper)机制的线程,同时android也提供了封装有消息循环...
android 线程之自定义带消息循环looper的实例
android系统的ui线程是一种带消息循环(looper)机制的线程,同时android也提供了封装有消息循环(looper)的handlerthread类,这种线程,可以绑定handler()对象,并通过handler的sendmessage()函数向线程发送消息,通过handlemessage()函数,处理线程接收到的消息。这么说比较抽象,那么,本文就利用基础的java类库,实现一个带消息循环(looper)的线程,以帮助初学者理解这样一个looper到底是怎么工作的。
1. 首先,我们完成一个简单的线程框架。
public class looperthread { private volatile boolean mislooperquit = false; private thread mthread; public void start() { if( mthread != null ) { return; } mislooperquit = false; mthread = new thread(mlooperrunnable); mthread.start(); } public void stop() { if( mthread == null ) { return; } mislooperquit = true; mthread = null; } protected runnable mlooperrunnable = new runnable() { @override public void run() { while( !mislooperquit ) { } } }; }
如上述代码所示,mlooperrunnable.run()循环执行线程任务,mislooperquit则是线程退出循环的条件。下面,我们将添加消息的发送和处理代码。
2. 添加线程循环的消息发送和处理代码
(1) 定义消息结构体,创建消息队列
public class looperthread { private queue<message> mmessagequeue = new linkedlist<message>(); public static class message { int what; } }
(2) 创建互斥锁和条件变量
public class looperthread { private lock mlock = new reentrantlock(); private condition mcondition = mlock.newcondition(); }
(3) 创建发送消息的函数
//发送消息,由外部其他模块调用,发送消息给线程 public void sendmessage( message message ) { if( mthread == null ) { return; } mlock.lock(); mmessagequeue.add(message); //添加消息到消息队列 mcondition.signal(); //通知线程循环,有消息来了,请立即处理 mlock.unlock(); }
(4) 创建处理消息的函数
//处理消息,由线程内部调用 public void handlemessage(message message) { //这里可以通过一个callback来回调监听者 }
(5) 在mlooperrunnable.run()循环中解析消息
protected runnable mlooperrunnable = new runnable() { @override public void run() { while( !mislooperquit ) { mlock.lock(); message message = null; try { while( !mislooperquit && mmessagequeue.isempty() ) { mcondition.await(); //没有消息到来则休眠 } message = mmessagequeue.poll(); } catch (interruptedexception e) { e.printstacktrace(); } finally { mlock.unlock(); } handlemessage(message ); } }; }
(6) 修改线程的stop()函数,唤醒休眠的消息循环
public void stop() { if( mthread == null ) { return; } mislooperquit = true; mlock.lock(); mcondition.signal(); mlock.unlock(); mmessagequeue.clear(); mthread = null; }
到这里,一个基本的带有消息循环的线程类封装就完成了,相信大家应该从编写这段代码的过程中,理解了系统是如何实现消息循环的。
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!