博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】Android开发实践:自定义带消息循环(Looper)的工作线程
阅读量:4942 次
发布时间:2019-06-11

本文共 2267 字,大约阅读时间需要 7 分钟。

 

上一篇文章提到了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
mMessageQueue = new LinkedList
(); 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; }

到这里,一个基本的带有消息循环的线程类封装就完成了,相信大家应该从编写这段代码的过程中,理解了系统是如何实现消息循环的。完整的代码见博文最后的附件,有任何疑问欢迎留言或者来信lujun.hust@gmail.com交流。

转载于:https://www.cnblogs.com/exmyth/p/5498854.html

你可能感兴趣的文章
中国象棋棋子及棋盘的绘制
查看>>
socketserver剖析.html
查看>>
分享两个网址,一个是使用mssql自带的跟踪工具和分析工具
查看>>
[贪心][高精度][NOIP]国王游戏
查看>>
Java对象创建的过程及对象的内存布局与访问定位
查看>>
设计模式之二-Proxy模式
查看>>
QT--以共享的方式发布应用,QT依赖库
查看>>
JAVA——孪生素数
查看>>
Asp.net页面间传值方式汇总
查看>>
DB相关问题
查看>>
hibernate 的一对多关联关系映射配置
查看>>
# Mysql免登录重置root密码
查看>>
创造型模式-生成器模式
查看>>
守护线程和非守护线程
查看>>
layui 日期插件onchange事件失效的方法
查看>>
第六章
查看>>
MVC5中Model层开发数据注解
查看>>
Python3安装cx_Oracle连接oracle数据库实操总结
查看>>
[NOIp2008] 双栈排序 (二分图染色 + 贪心)
查看>>
项目管理-软件开发模式对比(瀑布、迭代、螺旋、敏捷)
查看>>