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

 更新时间:2017年10月16日 16:38:28   作者:Jhuster  
这篇文章主要介绍了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;   
}

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

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

相关文章

  • Android中判断是否有前置摄像头、后置摄像头的方法

    Android中判断是否有前置摄像头、后置摄像头的方法

    这篇文章主要介绍了Android中判断是否有前置摄像头、后置摄像头的方法,本文直接给出实现代码,需要的朋友可以参考下
    2015-01-01
  • Flutter软键盘的原理浅析

    Flutter软键盘的原理浅析

    大家应该都知道目前Flutter官方是没有自定义键盘的解决方案,下面这篇文章主要给大家介绍了关于Flutter软键盘原理的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-10-10
  • Android自定义View绘制贝塞尔曲线实现流程

    Android自定义View绘制贝塞尔曲线实现流程

    贝塞尔曲线的本质是通过数学计算的公式来绘制平滑的曲线,分为一阶,二阶,三阶及多阶。但是这里不讲数学公式和验证,那些伟大的数学家已经证明过了,所以就只讲讲Android开发中的运用吧
    2022-11-11
  • Android自定义控件实现望远镜效果

    Android自定义控件实现望远镜效果

    这篇文章主要为大家详细介绍了Android自定义控件实现望远镜效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • Jetpack Compose状态专篇精讲

    Jetpack Compose状态专篇精讲

    在今年的Google/IO大会上,亮相了一个全新的 Android 原生 UI 开发框架-Jetpack Compose, 与苹果的SwiftIUI一样,Jetpack Compose是一个声明式的UI框架,这篇文章主要介绍了Jetpack Compose状态管理
    2022-10-10
  • Android源码中final关键字的用法及final,finally,finalize的区别

    Android源码中final关键字的用法及final,finally,finalize的区别

    Android的源码中很多地方对final关键字的用法很是“别出心裁”,之所以这么说是因为我从没看过是这么使用final关键字的,通过本文给大家分享Android源码中final关键字的用法及final,finally,finalize的区别,感兴趣的朋友一起学习吧
    2015-12-12
  • Flutter Android多窗口方案落地实战

    Flutter Android多窗口方案落地实战

    这篇文章主要为大家介绍了Flutter Android多窗口方案落地实战示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Android 读取txt,按行读取的实例讲解

    Android 读取txt,按行读取的实例讲解

    今天小编就为大家分享一篇Android 读取txt,按行读取的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • Android LinearLayout实现自动换行

    Android LinearLayout实现自动换行

    这篇文章主要为大家详细介绍了Android LinearLayout实现自动换行,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • Android使用系统自带的相机实现一键拍照功能

    Android使用系统自带的相机实现一键拍照功能

    这篇文章主要介绍了Android使用系统自带的相机实现一键拍照功能,非常不错,具有参考借鉴价值,需要的朋友参考下
    2017-01-01

最新评论