`
yunshangbuhe
  • 浏览: 228909 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

handler looper message asynctask 总结 转载

阅读更多
很多初入Android或Java开发的新手对Thread、Looper、Handler和Message仍然比较迷惑,衍生的有HandlerThread、java.util.concurrent、Task、AsyncTask由于目前市面上的书籍等资料都没有谈到这些问题,今天Android123就这一问题做更系统性的总结。

   Android开发过程中为什么要线程能?

   我们创建的Service、Activity以及Broadcast均是一个主线程处理,这里我们可以理解为UI线程。但是在操作一些耗时操作时,比如I/O读写的大文件读写,数据库操作以及网络下载需要很长时间,为了不阻塞用户界面,出现ANR的响应提示窗口,这个时候我们可以考虑使用Thread线程来解决。

  Android中使用Thread线程会遇到哪些问题?

  对于从事过J2ME开发的程序员来说Thread比较简单,直接匿名创建重写run方法,调用start方法执行即可。或者从Runnable接口继承,但对于Android平台来说UI控件都没有设计成为线程安全类型,所以需要引入一些同步的机制来使其刷新,这点Google在设计Android时倒是参考了下Win32的消息处理机制。

1. 对于线程中的刷新一个View为基类的界面,可以使用postInvalidate()方法在线程中来处理,其中还提供了一些重写方法比如postInvalidate(int left,int top,int right,int bottom) 来刷新一个矩形区域,以及延时执行,比如postInvalidateDelayed(long delayMilliseconds)或postInvalidateDelayed(long delayMilliseconds,int left,int top,int right,int bottom) 方法,其中第一个参数为毫秒,如下:



   2. 当然推荐的方法是通过一个Handler来处理这些,可以在一个线程的run方法中调用handler对象的 postMessage或sendMessage方法来实现,Android程序内部维护着一个消息队列,会轮训处理这些,如果你是Win32程序员可以很好理解这些消息处理,不过相对于Android来说没有提供 PreTranslateMessage这些干涉内部的方法。

  3. Looper又是什么呢? ,其实Android中每一个Thread都跟着一个Looper,Looper可以帮助Thread维护一个消息队列,昨天的问题 Can't create handler inside thread 错误 一文中提到这一概念,但是Looper和Handler没有什么关系,我们从开源的代码可以看到Android还提供了一个Thread继承类HanderThread可以帮助我们处理,在HandlerThread对象中可以通过getLooper方法获取一个Looper对象控制句柄,我们可以将其这个Looper对象映射到一个Handler中去来实现一个线程同步机制,Looper对象的执行需要初始化Looper.prepare方法就是昨天我们看到的问题,同时推出时还要释放资源,使用Looper.release方法。

  4.Message 在Android是什么呢? 对于Android中Handler可以传递一些内容,通过Bundle对象可以封装String、Integer以及Blob二进制对象,我们通过在线程中使用Handler对象的    sendEmptyMessage或sendMessage方法来传递一个Bundle对象到Handler处理器。对于Handler类提供了重写方法handleMessage(Message msg) 来判断,通过msg.what来区分每条信息。将Bundle解包来实现Handler类更新UI线程中的内容实现控件的刷新操作。相关的Handler对象有关消息发送sendXXXX相关方法如下,同时还有postXXXX相关方法,这些和Win32中的道理基本一致,一个为发送后直接返回,一个为处理后才返回 :              
              

  5. java.util.concurrent对象分析,对于过去从事Java开发的程序员不会对Concurrent对象感到陌生吧,他是JDK 1.5以后新增的重要特性作为掌上设备,我们不提倡使用该类,考虑到Android为我们已经设计好的Task机制,我们这里Android开发网对其不做过多的赘述,相关原因参考下面的介绍:

  6. 在Android中还提供了一种有别于线程的处理方式,就是Task以及AsyncTask,从开源代码中可以看到是针对Concurrent的封装,开发人员可以方便的处理这些异步任务,具体的Android123在以前的文章中有详细解释,可以使用站内搜索来了解更多。

  当然涉及到同步机制的方法和技巧还有很多,考虑时间和篇幅问题cwj不再做过多的描述,如果有问题可以来函至android123@163.com ,我们会做更多探讨。

分享到:
评论

相关推荐

    Handler与AsyncTask,Looper使用示例

    在Android开发中,`Handler`、`AsyncTask`和`Looper`是三个关键组件,用于在后台线程和主线(UI)线程之间进行通信,处理异步任务和更新用户界面。下面将详细阐述这三个组件的工作原理以及如何使用它们。 **Handler...

    Handler+Looper+MessageQueue

    总结起来,Handler、Looper 和 MessageQueue 是 Android 线程间通信的核心工具,它们使得非 UI 线程可以安全地更新 UI 界面,确保了应用程序的响应性和稳定性。理解和熟练运用这三个组件对于开发高质量的 Android ...

    handler与looper及messagequeue的简单总结

    在Android开发中,Handler、Looper和MessageQueue是用于实现线程间通信的关键组件,它们共同构建了一个消息处理机制。理解这三个概念以及它们之间的关系对于优化应用程序的性能和响应性至关重要。 Handler(处理器...

    android线程 Handler Message Queue AsyncTask线程模型 线程交互 + 修改Button样式 示例 最终easy整合版

    本文将深入探讨Android中的线程模型,重点讲解Handler、Message Queue和AsyncTask,并提供修改Button样式的示例以及如何将这些概念整合到一个易用的方案中。 1. **Android线程模型** Android系统的主线程,也称为...

    Handler与AsyncTask使用示例

    总结一下,`Handler`、`AsyncTask`和`Looper`在Android开发中起到了关键作用,它们帮助我们处理线程间的通信和异步任务。`Handler`用于发送和处理消息,`AsyncTask`简化了后台任务的执行,而`Looper`确保了消息的...

    Handler,Looper和Message

    - 使用`AsyncTask`或`IntentService`等更高级的组件可能更为方便,但在特定情况下,`Handler`、`Looper`和`Message`的组合能提供更大的灵活性。 了解和熟练掌握`Handler`、`Looper`和`Message`的工作原理,有助于...

    安卓Android源码——HandlerLooper1.rar

    这个`HandlerLooper1.rar`文件可能包含了对这些概念的深入解析和示例代码。 首先,我们来详细讲解`Handler`。`Handler`是Android中的一个类,它允许开发者在不同的线程中发送和处理消息。通常,我们在主线程(UI...

    Handler + Thread + Looper

    Handler、Thread和Looper之间的关系可以总结为:Handler是用来发送和处理消息的,它必须与一个Looper关联;Thread是消息处理的上下文,每个Thread可以有一个Looper;Looper则是在Thread中运行的消息循环,负责调度和...

    Handler和AsyncTask

    总结来说,Handler更适合处理复杂的任务调度和交互,而AsyncTask适用于简单的异步操作,如加载数据。选择哪种方式取决于具体需求和项目规模。在实际开发中,开发者可以根据项目的特性,结合Handler和AsyncTask的优势...

    Android应用源码之HandlerMessage1_HandlerMessage.zip

    总结来说,`Android应用源码之HandlerMessage1_HandlerMessage.zip`中的内容可能展示了如何利用`Handler`、`Message`和`Looper`进行多线程间的通信,以确保UI线程的流畅运行。理解和掌握这一机制对于Android开发者来...

    Handler与AsyncTask共2页.pdf.zip

    `Message`是承载数据的对象,`Handler`通过`sendMessage()`或`post()`方法发送`Message`到`Looper`的队列中。当主线程的`Looper`发现有新消息时,会调用`Handler`的`handleMessage()`方法来处理这些消息。 使用`...

    AsyncTask陷阱之:Handler,Looper与MessageQueue的详解

    总结一下,`Handler`、`Looper`和`MessageQueue`是Android异步通信的基础,它们协同工作以确保UI操作在主线程中执行。`AsyncTask`虽然方便,但也需要正确使用,否则可能导致程序异常。理解这些概念对于优化Android...

    android Handler Thread AsyncTask httpURLConnection

    `Handler`通常与`Looper`和`Message`配合使用,`Looper`是循环处理消息的对象,`Message`则是承载数据的容器。 `AsyncTask`是Android提供的一种轻量级的异步任务处理框架,它简化了在后台线程执行任务并在UI线程...

    Looper-Handler-AsyncTask

    在Android开发中,`Looper`、`Handler`和`AsyncTask`是三个核心组件,用于实现线程间的通信和异步处理。它们是Android应用程序中处理UI更新和后台任务的关键工具。 首先,让我们深入理解`Looper`。`Looper`是...

    Android应用源码之HandlerMessage2_应用.zip

    总结来说,Handler和Message是Android平台中实现多线程通信的核心工具,通过它们,开发者可以优雅地处理异步任务,确保UI交互的流畅性。深入研究"Android应用源码之HandlerMessage2_应用.zip"中的示例代码,有助于...

    android+threadhandler AsyncTask

    通过Looper(消息循环)和Message(消息对象),Handler可以在适当的线程上执行特定的操作。 实现步骤: 1. 在主线程中创建Handler对象。 2. 在子线程中创建Runnable对象,执行下载图片的任务,并在任务完成后...

    AsyncTask和Handler的优缺点比较

    Handler异步实现的原理和适用的优缺点在Handler异步实现时,涉及到Handler、Looper、Message、Thread四个对象,实现异步的流程是主线程启动Thread(子线程)运行并生成Message-Looper获取Message并传递给Handler,...

    HandlerThread,AsyncTask,Handler的一个小例子

    当Handler接收到Message或Runnable对象时,它会在关联的Looper线程中执行相应的回调方法,这对于更新UI非常有用。 在"ProgressBarHandler"这个示例中,可能包含了如何使用HandlerThread、AsyncTask和Handler来更新...

    android 之 Hnadler 、Message 、Looper

    例如,com.example.handlertext.MainActivity可能就是一个使用了Handler、Message和Looper的示例,其中MainActivity的onCreate()方法可能初始化了Handler,然后在其他地方(如AsyncTask的onPostExecute())发送...

Global site tag (gtag.js) - Google Analytics