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

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

概述Android线程自定义带消息循环Looper的实例Android系统的UI线程是一种带消息循环(Looper)机制的线程,同时Android也提供了封装有消息循环(Looper)的HandlerThread类,这种线程,可以绑定Handler()对象,并通过

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

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

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

总结

以上是内存溢出为你收集整理的Android 线程之自定义带消息循环Looper的实例全部内容,希望文章能够帮你解决Android 线程之自定义带消息循环Looper的实例所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1144105.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存