Android应用程序线程消息循环模型分析(6)

简介:
 我们可以通过mFuture对象来操作当前执行的任务,例如查询当前任务的状态,它是正在执行中,还是完成了,还是被取消了,如果是完成了,还可以通过它获得任务的执行结果,如果还没有完成,可以取消任务的执行。
        当工作任务mWorker执行完成的时候,mFuture对象中的done函数就会被被调用,根据任务的完成状况,执行相应的操作,例如,如果是因为异常而完成时,就会抛异常,如果是正常完成,就会把任务执行结果封装成一个AsyncTaskResult对象:
 
 
  1. private static class AsyncTaskResult<Data> {   
  2.     final AsyncTask mTask;   
  3.     final Data[] mData;   
  4.    
  5.     AsyncTaskResult(AsyncTask task, Data... data) {   
  6.         mTask = task;   
  7.         mData = data;   
  8.     }   
  9. }   
 其中,成员变量mData保存的是任务执行结果,而成员变量mTask指向前面我们创建的AsyncTask对象。
        最后把这个AsyncTaskResult对象封装成一个消息,并且通过消息处理器sHandler加入到应用程序主线程的消息队列中:
 
 
  1. message = sHandler.obtainMessage(MESSAGE_POST_RESULT,   
  2.     new AsyncTaskResult<Result>(AsyncTask.this, result));   
  3. message.sendToTarget();   
  这个消息最终就会在InternalHandler类的handleMessage函数中处理了:
 
 
  1. private static class InternalHandler extends Handler {   
  2.     @SuppressWarnings({"unchecked""RawUseOfParameterizedType"})   
  3.     @Override   
  4.     public void handleMessage(Message msg) {   
  5.         AsyncTaskResult result = (AsyncTaskResult) msg.obj;   
  6.         switch (msg.what) {   
  7.         case MESSAGE_POST_RESULT:   
  8.             // There is only one result   
  9.             result.mTask.finish(result.mData[0]);   
  10.             break;   
  11.         ......   
  12.         }   
  13.     }   
  14. }   
   在这个函数里面,最终会调用前面创建的这个AsyncTask对象的finish函数来进一步处理:
 
 
  1. private void finish(Result result) {   
  2.        ......   
  3.        onPostExecute(result);   
  4.        ......   
  5. }   
      这个函数调用AsyncTask类的onPostExecute函数来进一步处理,AsyncTask类的onPostExecute函数一般是要由其子类来重载的,注意,这个函数是在应用程序的主线程中执行的,因此,它可以操作应用程序的界面。
        在任务执行的过程当中,即执行doInBackground函数时候,可能通过调用publishProgress函数来将中间结果封装成一个消息发送到应用程序主线程中的消息队列中去:
 
 
  1. protected final void publishProgress(Progress... values) {   
  2.     sHandler.obtainMessage(MESSAGE_POST_PROGRESS,   
  3.         new AsyncTaskResult<Progress>(this, values)).sendToTarget();   
  4. }   
   这个消息最终也是由InternalHandler类的handleMessage函数来处理的:
 
 
  1. private static class InternalHandler extends Handler {   
  2.     @SuppressWarnings({"unchecked""RawUseOfParameterizedType"})   
  3.     @Override   
  4.     public void handleMessage(Message msg) {   
  5.         AsyncTaskResult result = (AsyncTaskResult) msg.obj;   
  6.         switch (msg.what) {   
  7.         ......   
  8.         case MESSAGE_POST_PROGRESS:   
  9.                  result.mTask.onProgressUpdate(result.mData);   
  10.                  break;   
  11.         ......   
  12.         }   
  13.     }   
  14. }   
   这里它调用前面创建的AsyncTask对象的onPorgressUpdate函数来进一步处理,这个函数一般是由AsyncTask的子类来实现的,注意,这个函数是在应用程序的主线程中执行的,因此,它和前面的onPostExecute函数一样,可以操作应用程序的界面。

 
       这样,AsyncTask类的主要实现就介绍完了,结合前面开发的应用程序Counter来分析,会更好地理解它的实现原理。
       至此,Android应用程序线程消息循环模型就分析完成了,理解它有利于我们在开发Android应用程序时,能够充分利用多线程的并发性来提高应用程序的性能以及获得良好的用户体验。




本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/966891,如需转载请自行联系原作者
目录
打赏
0
0
0
0
235
分享
相关文章
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
519 4
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
深入探索Android与iOS系统安全性的对比分析
在当今数字化时代,移动操作系统的安全已成为用户和开发者共同关注的重点。本文旨在通过比较Android与iOS两大主流操作系统在安全性方面的差异,揭示两者在设计理念、权限管理、应用审核机制等方面的不同之处。我们将探讨这些差异如何影响用户的安全体验以及可能带来的风险。
160 21
|
5月前
|
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
161 15
Android 系统缓存扫描与清理方法分析
安卓与iOS开发环境对比分析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据半壁江山。本文深入探讨了这两个平台的开发环境,从编程语言、开发工具到用户界面设计等多个角度进行比较。通过实际案例分析和代码示例,我们旨在为开发者提供一个清晰的指南,帮助他们根据项目需求和个人偏好做出明智的选择。无论你是初涉移动开发领域的新手,还是寻求跨平台解决方案的资深开发者,这篇文章都将为你提供宝贵的信息和启示。
64 8
安卓应用程序开发的新手指南:从零开始构建你的第一个应用
【10月更文挑战第20天】在这个数字技术不断进步的时代,掌握移动应用开发技能无疑打开了一扇通往创新世界的大门。对于初学者来说,了解并学习如何从无到有构建一个安卓应用是至关重要的第一步。本文将为你提供一份详尽的入门指南,帮助你理解安卓开发的基础知识,并通过实际示例引导你完成第一个简单的应用项目。无论你是编程新手还是希望扩展你的技能集,这份指南都将是你宝贵的资源。
221 5
线程死循环确实是多线程编程中的一个常见问题,它可能导致应用程序性能下降,甚至使整个系统变得不稳定。
线程死循环是多线程编程中常见的问题,可能导致性能下降或系统不稳定。通过代码审查、静态分析、日志监控、设置超时、使用锁机制、测试、选择线程安全的数据结构、限制线程数、使用现代并发库及培训,可有效预防和解决死循环问题。
153 1
Android底层:通熟易懂分析binder:1.binder准备工作
本文详细介绍了Android Binder机制的准备工作,包括打开Binder驱动、内存映射(mmap)、启动Binder主线程等内容。通过分析系统调用和进程与驱动层的通信,解释了Binder如何实现进程间通信。文章还探讨了Binder主线程的启动流程及其在进程通信中的作用,最后总结了Binder准备工作的调用时机和重要性。
Android底层:通熟易懂分析binder:1.binder准备工作
探索安卓与iOS的安全性差异:技术深度分析与实践建议
本文旨在深入探讨并比较Android和iOS两大移动操作系统在安全性方面的不同之处。通过详细的技术分析,揭示两者在架构设计、权限管理、应用生态及更新机制等方面的安全特性。同时,针对这些差异提出针对性的实践建议,旨在为开发者和用户提供增强移动设备安全性的参考。
259 3
安卓与iOS开发环境的差异性分析
【10月更文挑战第8天】 本文旨在探讨Android和iOS两大移动操作系统在开发环境上的不同,包括开发语言、工具、平台特性等方面。通过对这些差异性的分析,帮助开发者更好地理解两大平台,以便在项目开发中做出更合适的技术选择。

热门文章

最新文章