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

Android-Looper类

阅读更多
    Android中的Looper类,是用来封装消息循环和消息队列的一个类,用于在android线程中进行消息处理。handler其实可以看做是一个工具类,用来向消息队列中插入消息的。

(1) Looper类用来为一个线程开启一个消息循环。
    默认情况下android中新诞生的线程是没有开启消息循环的。(主线程除外,主线程系统会自动为其创建Looper对象,开启消息循环。)
    Looper对象通过MessageQueue来存放消息和事件。一个线程只能有一个Looper,对应一个MessageQueue。

(2) 通常是通过Handler对象来与Looper进行交互的。Handler可看做是Looper的一个接口,用来向指定的Looper发送消息及定义处理方法。
    默认情况下Handler会与其被定义时所在线程的Looper绑定,比如,Handler在主线程中定义,那么它是与主线程的Looper绑定。
mainHandler = new Handler() 等价于new Handler(Looper.myLooper()).
Looper.myLooper():获取当前进程的looper对象,类似的 Looper.getMainLooper() 用于获取主线程的Looper对象。

(3) 在非主线程中直接new Handler() 会报如下的错误:
E/AndroidRuntime( 6173): Uncaught handler: thread Thread-8 exiting due to uncaught exception
E/AndroidRuntime( 6173): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
原因是非主线程中默认没有创建Looper对象,需要先调用Looper.prepare()启用Looper。

(4) Looper.loop(); 让Looper开始工作,从消息队列里取消息,处理消息。

    注意:写在Looper.loop()之后的代码不会被执行,这个函数内部应该是一个循环,当调用mHandler.getLooper().quit()后,loop才会中止,其后的代码才能得以运行。

(5) 基于以上知识,可实现主线程给子线程(非主线程)发送消息。

    把下面例子中的mHandler声明成类成员,在主线程通过mHandler发送消息即可。
   
    Android官方文档中Looper的介绍:
Class used to run a message loop for a thread. Threads by default do not have a message loop associated with them; to create one, call prepare() in the thread that is to run the loop, and then loop() to have it process messages until the loop is stopped.

Most interaction with a message loop is through the Handler class.

This is a typical example of the implementation of a Looper thread, using the separation of prepare() and loop() to create an initial Handler to communicate with the Looper.

class LooperThread extends Thread {
      public Handler mHandler;
      
      public void run() {
          Looper.prepare();
          
          mHandler = new Handler() {
              public void handleMessage(Message msg) {
                  // process incoming messages here
              }
          };
          
          Looper.loop();
      }
}
1
0
分享到:
评论

相关推荐

    Android的消息处理机制--Looper,Handler

    首先,`Looper`是Android消息循环的核心。它的主要任务是不断地从`MessageQueue`中取出`Message`对象,并将其分发给相应的`Handler`进行处理。`Looper`的构造函数是私有的,目的是为了防止直接实例化,而是通过`...

    自定义Handler-Looper实现线程间通信

    Handler、Looper和Message是Android系统提供的一套用于在不同线程之间传递消息和进行同步的关键组件。本文将深入探讨如何自定义Handler、Looper来实现线程间的通信。 首先,我们了解下Handler的基本原理。Handler是...

    Android开发实战经典-030905-消息机制-B-Looper视频教程.zip

    Android开发实战经典_030905_消息机制_B_Looper视频教程.zip

    Android Looper使用介绍

    Android 官方文档中对 Looper 的介绍中,Looper 被描述为一个用于运行消息循环的类,线程默认情况下没有消息循环,需要调用 prepare() 方法来创建消息循环,然后调用 loop() 方法来处理消息直到循环停止。...

    Android开发中Looper.prepare()和Looper.loop()

     Looper用于封装了android线程中的消息循环,默认情况下一个线程是不存在消息循环(message loop)的,需要调用Looper.prepare()来给线程创建一个消息循环,调用Looper.loop()来使消息循环起作用,使用Looper....

    android-app-master 源代码

    6. **异步处理**:为了防止UI线程阻塞,开发者通常会使用AsyncTask、IntentService或现代的Handler-Looper机制进行后台任务处理。 7. **权限管理**:自Android 6.0(API级别23)起,运行时权限系统引入,源代码可能...

    android-audio-visualizer,android媒体播放器的音频可视化.zip

    - Android的Canvas和Paint类可用于绘制可视化图形,包括线条、形状和颜色填充。 - 对于更复杂的动画效果,项目可能使用了Android的Animation框架或第三方库如Lottie。 6. **自定义化**: - 开源项目通常允许...

    android-22 sdk source

    例如,通过查看 Handler、Looper 和 MessageQueue 的实现,可以更好地掌握线程通信机制,从而优化 UI 更新或后台任务处理。此外,对于内存管理,比如 Garbage Collector (GC) 的工作原理,也可以通过源码学习到更多...

    Android-Handler-Looper-:处理程序,循环程序,消息队列

    android的消息处理有三个核心类:Looper,Handler和Message。其实还有一个MessageQueue(消息队列),但是Message被封装到Looper里面了,我们不会直接与Message打交道,因此我没将其作为核心类。下面一一介绍下: ...

    Android-Event-driver.zip_Looper_android_android Handler_event

    在上一篇文章《Android应用程序消息处理机制(Looper、Handler)分析》中,我们分析了Android应用程序的消息处理机制,本文将结合这种消息处理机制来详细分析Android应用程序是如何获得键盘按键消息的。

    深入浅出Android--Google手持设备应用程序设计(PDF版).rar

    在多线程和性能优化方面,书中会讲解Android中的线程模型,如何使用Handler、Looper和AsyncTask进行异步操作,以及如何避免内存泄漏和提高应用性能。这将帮助开发者写出更流畅、更稳定的程序。 Google Play服务也是...

    Android Handler Looper Message 使用示例

    自己写的关于Android的Looper的示例程序。在主线程即UI线程外,新建一个Looper线程,并用Messenger和Handler来处理message和posted runnable。程序中,在负线程中默认加了一个3s的线程等来,来帮助理解sent message...

    android looper分析

    Looper 类与 Handler 和 Message Queue 共同构成了 Android 的消息处理框架,它们之间的协同工作保证了应用程序能够高效地响应用户交互,并保持良好的性能表现。 #### 二、核心概念解析 **1. Looper** - **定义**...

    android Looper

    例如,在播放音频或视频时,`MediaPlayer`类会利用`Looper`来处理来自系统服务和应用层的消息,确保播放操作的顺利进行。在处理媒体数据时,可能需要进行解码、渲染等复杂操作,这些操作通常在单独的线程中进行,...

    Android--开发--doc.rar

    11. **AsyncTask**和**Handler**:两者都是异步编程工具,AsyncTask适合短时间的后台任务,而Handler-Looper-Message机制适合更复杂的通信和定时任务。 12. **权限管理**:Android 6.0及以上版本引入了运行时权限,...

    Android 工具类android-common

    在Android开发过程中,工具类(Utility Classes)是开发者经常使用的代码模块,它们包含了各种实用功能,可以帮助我们简化常见的编程任务。"Android 工具类android-common"是一个专门为Android平台设计的集合,它...

    Android---universal-image-loader应用 异步加载图片并缓存

    在Android中,通常使用`AsyncTask`或者`Handler`/`Looper`机制来实现。`Universal Image Loader`使用了线程池和任务队列的概念,将图片的下载和显示工作放在后台线程中执行,确保UI的流畅性。 2. **图片缓存策略**...

    Android应用源码之Android-Sip2Peer-1.0 实现p2p.zip

    开发者需要熟悉Handler、Looper和AsyncTask等机制,以了解源码中如何处理网络事件、UI更新以及多线程间的通信。 七、安全与隐私保护 P2P通信涉及敏感信息的传输,因此,源码中可能包含加密和安全措施,如SSL/TLS等...

    Android线程模式(handler,thread,looper)

    2. **Thread**:Thread是Java语言中的基础线程类,Android也继承了这一特性。通过创建一个新的Thread对象并调用其`start()`方法,可以启动一个新的线程。然而,Thread本身并不包含消息循环机制,所以单纯使用Thread...

Global site tag (gtag.js) - Google Analytics