Android 线程之自定义带消息循环Looper的实例

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; }

到这里,一个基本的带有消息循环的线程类封装就完成了,相信大家应该从编写这段代码的过程中,理解了系统是如何实现消息循环的。

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

时间: 2024-09-24 20:35:37

Android 线程之自定义带消息循环Looper的实例的相关文章

Android实现自定义带删除功能的EditText实例

1.说明 自定义带删除功能的EditText有两种方法,第一种是用组合视图的方法,即在一个view视图里面左侧放置一个EditText,右侧放置一个ImageView,但是这样增加了视图的层次,而且对输入内容的长度要做一定的处理. 第二种是重新定义EditText组件,增加相应的事件处理,即可达到很好的效果,效果图如下: 2.ClearEditText的JAVA类文件 /** * @说明: 自定义带删除按钮的EditText * */ public class ClearEditText ext

Android开发实现自定义新闻加载页面功能实例

本文实例讲述了Android开发实现自定义新闻加载页面功能.分享给大家供大家参考,具体如下: 一.概述: 1.效果演示: 2.说明:在新闻页面刚加载的时候,一般会出现五种状态 未知状态(STATE_UNKNOW).空状态(STATE_EMPTY).加载中(STATE_LOADING).错误(STATE_ERROT).成功(STATE_SUCCESS) 因为每个Detail页面都会出现,所以我们可以把他们封装成一个LoadPage的自定义view,可以复用 二.实现: 1.首先的定义三个布局,为什

Android进阶篇-自定义图片伸缩控件具体实例_Android

ZoomImageView.java: 复制代码 代码如下: /** * @author gongchaobin *  *  自定义可伸缩的ImageView */public class ZoomImageView extends View{    /** 画笔类  **/    private Paint mPaint;     private Runnable mRefresh = null;    /** 缩放手势监听类  **/    private ScaleGestureDetec

Android编程之自定义AlertDialog(退出提示框)用法实例_Android

本文实例讲述了Android编程自定义AlertDialog(退出提示框)用法,分享给大家供大家参考,具体如下: 有时候我们需要在游戏或应用中用一些符合我们样式的提示框(AlertDialog) 以下是我在开发一个小游戏中总结出来的.希望对大家有用. 先上效果图: 下面是用到的背景图或按钮的图片 经过查找资料和参考了一下例子后才知道,要实现这种效果很简单.就是在设置alertDialog的contentView. 以下的代码是写在Activity下的,代码如下: public boolean o

Android编程之自定义AlertDialog(退出提示框)用法实例

本文实例讲述了Android编程自定义AlertDialog(退出提示框)用法,分享给大家供大家参考,具体如下: 有时候我们需要在游戏或应用中用一些符合我们样式的提示框(AlertDialog) 以下是我在开发一个小游戏中总结出来的.希望对大家有用. 先上效果图: 下面是用到的背景图或按钮的图片 经过查找资料和参考了一下例子后才知道,要实现这种效果很简单.就是在设置alertDialog的contentView. 以下的代码是写在Activity下的,代码如下: public boolean o

Android消息循环机制源码深入理解

Android消息循环机制源码 前言: 搞Android的不懂Handler消息循环机制,都不好意思说自己是Android工程师.面试的时候一般也都会问这个知识点,但是我相信大多数码农肯定是没有看过相关源码的,顶多也就是网上搜搜,看看别人的文章介绍.学姐不想把那个万能的关系图拿出来讨论. 近来找了一些关于android线程间通信的资料,整理学习了一下,并制作了一个简单的例子. andriod提供了 Handler 和 Looper 来满足线程间的通信.例如一个子线程从网络上下载了一副图片,当它下

Android如何在自定义view中发送消息给主线程

问题描述 Android如何在自定义view中发送消息给主线程 求求各位大神支招,小弟在自己开发一个东西,遇到了一个小问题. ![ 图片说明](http://img.ask.csdn.net/upload/201603/15/1458054689_616589.jpg) 我在自定义view的onDraw里,当条件达到后就开启一个子线程发送消息给主线程,让主线程中的handler接收消息并执行相应的动作,可是在Log的输出下只能输出"子线程,"而没有"handlemessage

android线程消息机制之Handler详解

android线程消息机制主要由Handler,Looper,Message和MessageQuene四个部分组成.平常在开发中,我们常用来在子线程中通知主线程来更新,其实整个安卓生命周期的驱动都是通过Handler(ActivityThread.H)来实现的. 首先我们先介绍这四个类的作用: Handler:消息的发送者.负责将Message消息发送到MessageQueue中.以及通过Runnable,Callback或者handleMessage()来实现消息的回调处理 Looper:是消

Android Handler之消息循环的深入解析_Android

Handler是用于操作线程内部的消息队列的类.这有点绕,没关系,我们慢慢的来讲.前面Looper一篇讲到了Looper是用于给线程创建消息队列用的,也就是说Looper可以让消息队列(MessageQueue)附属在线程之内,并让消息队列循环起来,接收并处理消息.但,我们并不直接的操作消息队列,而是用Handler来操作消息队列,给消息队列发送消息,和从消息队列中取出消息并处理.这就是Handler的职责.Handler,Looper和MessageQueue是属于一个线程内部的数据,但是它提