Android开发实践:自定义带消息循环(Looper)的工作线程

简介:

1. 首先,我们完成一个简单的线程框架。

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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) 定义消息结构体,创建消息队列


1
2
3
4
5
6
7
8
public  class  LooperThread {
 
     private  Queue<Message> mMessageQueue =  new  LinkedList<Message>();
     
     public  static  class  Message {
         int  what;
     }        
}


(2) 创建互斥锁和条件变量


1
2
3
4
5
public  class  LooperThread {
 
      private  Lock mLock =  new  ReentrantLock();
      private  Condition mCondition = mLock.newCondition();       
}


(3) 创建发送消息的函数


1
2
3
4
5
6
7
8
9
10
//发送消息,由外部其他模块调用,发送消息给线程
public  void  sendMessage( Message message ) {
     if ( mThread ==  null  ) {
         return ;
     }      
     mLock.lock();
     mMessageQueue.add(message);  //添加消息到消息队列
     mCondition.signal();         //通知线程循环,有消息来了,请立即处理
     mLock.unlock();
}


(4) 创建处理消息的函数


1
2
3
4
//处理消息,由线程内部调用
public  void  handleMessage(Message message) {
     //这里可以通过一个Callback来回调监听者
}


(5) 在mLooperRunnable.run()循环中解析消息


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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()函数,唤醒休眠的消息循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public  void  stop() {    
 
     if ( mThread ==  null  ) {
         return ;
     }      
 
     mIsLooperQuit =  true ;
         
     mLock.lock();      
     mCondition.signal();
     mLock.unlock();
     
     mMessageQueue.clear();
     mThread =  null ;      
}


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



本文转自 Jhuster 51CTO博客,原文链接:http://blog.51cto.com/ticktick/1565272,如需转载请自行联系原作者

相关文章
|
1月前
|
存储 监控 小程序
Java中的线程池优化实践####
本文深入探讨了Java中线程池的工作原理,分析了常见的线程池类型及其适用场景,并通过实际案例展示了如何根据应用需求进行线程池的优化配置。文章首先介绍了线程池的基本概念和核心参数,随后详细阐述了几种常见的线程池实现(如FixedThreadPool、CachedThreadPool、ScheduledThreadPool等)的特点及使用场景。接着,通过一个电商系统订单处理的实际案例,分析了线程池参数设置不当导致的性能问题,并提出了相应的优化策略。最终,总结了线程池优化的最佳实践,旨在帮助开发者更好地利用Java线程池提升应用性能和稳定性。 ####
|
29天前
|
搜索推荐 Android开发 开发者
安卓应用开发中的自定义控件实践
在安卓应用开发的广阔天地中,自定义控件如同璀璨的星辰,点亮了用户界面设计的夜空。它们不仅丰富了交互体验,更赋予了应用独特的个性。本文将带你领略自定义控件的魅力,从基础概念到实际应用,一步步揭示其背后的原理与技术细节。我们将通过一个简单的例子——打造一个具有独特动画效果的按钮,来展现自定义控件的强大功能和灵活性。无论你是初学者还是资深开发者,这篇文章都将为你打开一扇通往更高阶UI设计的大门。
|
1月前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
2月前
|
缓存 Java 开发者
Java多线程并发编程:同步机制与实践应用
本文深入探讨Java多线程中的同步机制,分析了多线程并发带来的数据不一致等问题,详细介绍了`synchronized`关键字、`ReentrantLock`显式锁及`ReentrantReadWriteLock`读写锁的应用,结合代码示例展示了如何有效解决竞态条件,提升程序性能与稳定性。
153 6
|
2月前
|
安全 Java 开发者
Java中的多线程编程:从基础到实践
本文深入探讨了Java多线程编程的核心概念和实践技巧,旨在帮助读者理解多线程的工作原理,掌握线程的创建、管理和同步机制。通过具体示例和最佳实践,本文展示了如何在Java应用中有效地利用多线程技术,提高程序性能和响应速度。
68 1
|
2月前
|
API Android开发 iOS开发
深入探索Android与iOS的多线程编程差异
在移动应用开发领域,多线程编程是提高应用性能和响应性的关键。本文将对比分析Android和iOS两大平台在多线程处理上的不同实现机制,探讨它们各自的优势与局限性,并通过实例展示如何在这两个平台上进行有效的多线程编程。通过深入了解这些差异,开发者可以更好地选择适合自己项目需求的技术和策略,从而优化应用的性能和用户体验。
|
2月前
|
Java 开发者
Java多线程编程的艺术与实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的技术文档,本文以实战为导向,通过生动的实例和详尽的代码解析,引领读者领略多线程编程的魅力,掌握其在提升应用性能、优化资源利用方面的关键作用。无论你是Java初学者还是有一定经验的开发者,本文都将为你打开多线程编程的新视角。 ####
|
2月前
|
数据采集 Java Python
爬取小说资源的Python实践:从单线程到多线程的效率飞跃
本文介绍了一种使用Python从笔趣阁网站爬取小说内容的方法,并通过引入多线程技术大幅提高了下载效率。文章首先概述了环境准备,包括所需安装的库,然后详细描述了爬虫程序的设计与实现过程,包括发送HTTP请求、解析HTML文档、提取章节链接及多线程下载等步骤。最后,强调了性能优化的重要性,并提醒读者遵守相关法律法规。
69 0
|
2月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
28天前
|
搜索推荐 前端开发 API
探索安卓开发中的自定义视图:打造个性化用户界面
在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
53 19