handler 线程,android thread handler

  handler 线程,android thread handler

  Android的UI是单线程的。为了避免拖动GUI,一些耗时的对象应该交给独立的线程来执行。如果后台的线程执行UI对象,Android会发送一个错误消息,名为CalledFromWrongThreadException。

  信息排队

  在单线程模式下,为了解决类似的问题,Android设计了一个消息队列(Message Queue),通过它线程可以结合Handler和Looper组件进行信息交换。下面将分别介绍:

  1.消息

  消息被理解为线程之间通信的信息。如果处理数据的后台线程需要更新UI,它会将消息中包含的一些数据发送给UI线程。

  2.处理者

  Handler handler是消息的主要处理者,负责消息的发送和消息内容的执行。后台线程通过传入的处理程序对象引用发送消息。在使用Handler的时候,需要实现这个类的handleMessage(Message)方法,就是处理这些消息的操作内容,比如更新UI。Handler通常被子类化以实现handleMessage方法。

  3.信息排队

  消息队列Message Queue,用于存储Handler发布的消息,以先进先出的方式执行。

  每个消息队列都有一个相应的处理程序。处理程序以两种方式向消息队列发送消息:sendMessage或post。这两条消息都将被插入到消息队列的末尾,并以先进先出的方式执行。不过这两种方法发送的消息执行方式略有不同:sendMessage发送的是一个message对象,会被Handler的handleMessage()函数处理;如果通过post方法发送一个runnable对象,它将自己执行。

  4.尺蠖

  Looper是每个线程中消息队列的管家。Android全局没有消息队列,Android会自动为主线程(UI线程)创建一个消息队列,但是子线程中没有消息队列。所以调用Looper.getMainLooper()得到的主线程的Looper不为NULL,但是调用Looper.myLooper()得到的当前线程的Looper可能为NULL。

  对于使用Looper的子线程,API Doc提供了正确的使用方法:

  类LooperThread扩展线程{

  公共处理程序mHandler

  公共无效运行(){

  looper . prepare();//创建该线程的循环,并创建MessageQueue

  mHandler=new Handler() {

  公共void handleMessage(Message msg) {

  //在此处理传入的消息

  looper . loop();//开始运行Looper并监听消息队列

  }

  该消息机制的一般流程:

  1.Looper.loop()方法开始运行后,消息队列中的非空消息按照接收顺序循环取出。

  2.首先,消息队列中的所有消息都为空。当Handler.sendMessage(Message)进入消息队列时,该函数将该消息对象的target属性设置为当前的Handler对象。然后Looper取出消息,调用消息的目标指向的Hander的dispatcher消息函数对消息进行处理。

  在dispatchMessage方法中,如何处理消息由用户指定。有三个判断,优先级从高到低:

  1)消息中的回调,一个实现Runnable接口的对象,其中run函数进行处理;

  2)实现处理程序中mCallback所指向的回调接口的对象由其handleMessage处理;

  3)处理消息的Handler对象对应的类继承并实现了handleMessage函数,通过这个实现的handleMessage函数处理消息。

  所以我们实现的handleMessage方法优先级最低!

  3.处理程序处理完消息后(更新UI),Looper将消息设置为NULL以便回收!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • windowsandroid手机版下载,windowsandroid安装apk
  • windowsandroid手机版下载,windowsandroid安装apk,WindowsAndroid 安装教程详解
  • android调用webview方法,androidwebview是什么,Android 中 WebView 的基本用法详解
  • android传感器高级编程,Android传感器,Android编程之光线传感器用法详解
  • android.app.Dialog,android自定义dialog对话框,Android开发笔记之-Dialog的使用详解
  • android 图片视频轮播框架,androidlayout轮播图,Android实现炫酷轮播图效果
  • android里的viewpager,安卓自定义view流程,Android自定义引导玩转ViewPager的方法详解
  • android里的viewpager,android viewpager详解
  • android里的viewpager,android viewpager详解,Android自定义超级炫酷的ViewPage指示器
  • android调用webview方法,androidwebview是什么
  • android设置控件宽度,android获取屏幕宽度和高度
  • android设置控件宽度,android获取屏幕宽度和高度,Android中获取控件宽高的4种方法集合
  • android蓝牙开发的基本流程,安卓蓝牙app开发教程
  • android蓝牙开发的基本流程,安卓蓝牙app开发教程,android蓝牙简单开发示例教程
  • android菜单栏,android菜单控件
  • 留言与评论(共有 条评论)
       
    验证码: