欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

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

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