关闭

HandlerThread 类的使用

156人阅读 评论(0) 收藏 举报

        最近遇到一个问题,在Handler的handleMessage()函数中,如何处理耗时操作 。

        一开始的思路是在handleMessage()函数中开工作线程,执行完耗时操作后再发消息给自身。这种方式可能会造成线程过多,影响效率,甚至数据的不准确。

       犯这种错误的原因在于对Handler的构造函数理解不深,平时用的最多的是无参构造函数 Handler handler=new Handler();这样构造出的handler是和UI线程邦定的,所以在handleMessage()函数中,不能进行耗时操作。

        但Handler还有其他构造函数,例如 Handler handler=new Handler(Looper); 使用这个构造函数创建的Handler,运行在哪个线程,取决于参数Looper在哪个线程。如果参数Looper运行在工作线程,那么该Handler与工作线程绑定,在其handleMessage()函数中,可以直接进行耗时操作。

        因此上面的问题可以通过初始化Handler时,传入工作线程的Looper来解决。

        如何拿到与工作线程邦定的Looper?

        Android提供了HandlerThread类来让我们解决这个问题。


伪代码:


HandlerThread    hThread=new HandlerThread("myThread");     //创建名为myThread的工作线程,线程名字可以任意更改

hThread.start();                      //启动工作线程,必须执行这一步

Handler handler=new Handler(hThread.getLooper()){          //将Handler与工作线程绑定

 public void handleMessage(Message msg){

...........................                                                           //此函数中可以直接执行耗时操作,解决上述问题。

}

};


总结:

      Handler是开发中常用的类,但往往越常用的东西越容易忽略其实现原理,可能是因为工作中琐事较多,也可能是因为有时间会去学习其他较陌生的内容,或者是对源码认知不够。

      学习没有捷径,只有一步一个脚印把已知的搞明白,再去学习未知的,才能进步。



0
0
查看评论

HandlerThread类的使用和分析

概述 HandlerThread继承自Thread类,本质上还是Thread。与普通Thread的区别在于,它在创建一个线程的同时也创建了一个绑定该线程的消息循环,可以在当前线程中分发和处理消息。 Handy class for starting a new thread that has ...
  • ruancoder
  • ruancoder
  • 2016-09-06 18:16
  • 1777

为什么要使用HandlerThread

在android-sdk/sources/android-x下可以看到源码。 在android.os的包下,有一个HandlerThread的类,继承自Thread,是Google提供的线程类。 package android.os; public class HandlerThr...
  • tianmaxingkong_
  • tianmaxingkong_
  • 2016-07-27 00:24
  • 1654

Android 进阶15:HandlerThread 使用场景及源码解析

眼睛困得要死,但今天的计划不完成又怎么能睡呢?明日复明日,明日何其多啊! 读完本文你将了解: HandlerThread 简介 HandlerThread 源码 HandlerThread 的使用场景 举个栗子 运行结果 总结 代码地址为了避免 ANR,我们常常需要在线程中做耗时操作,然后把结果抛到...
  • u011240877
  • u011240877
  • 2017-06-07 23:55
  • 3249

谈谈对HandlerThread的理解

一.介绍            HandlerThread继承自Thread,当线程开启时,也就是它run方法运行起来后,线程同时创建了一个含有消息队列的Looper,并对外提供自己这个Looper对象的get方法,这就是它和普...
  • junjianzhang
  • junjianzhang
  • 2015-04-11 20:16
  • 1571

Android HandlerThread的用法

HandlerThread 继承自Thread,内部封装了Looper。 首先Handler和HandlerThread的主要区别是:Handler与Activity在同一个线程中,HandlerThread与Activity不在同一个线程,而是别外新的线程中(Handler中不能做耗时的操作)。...
  • shineflowers
  • shineflowers
  • 2014-12-02 14:03
  • 21369

HandlerThread(子线程也可以有消息传递机制)

知识点 HandlerThread,顾名思义,Handler+Thread,就是让子线程也能有一套和MainThread一样的Handler消息机制。HandlerThread本质上是一个线程类,它继承了Thread HandlerThread有自己的内部Looper对象,可以进行looper循...
  • iromkoear
  • iromkoear
  • 2017-03-17 21:39
  • 650

Android中HandlerThread和IntentService详解

在Android中有两种线程UI线程和子线程,我们都很清楚如果在UI线程进行耗时处理的话就容易引起ANR、如果是一个网络请求放在UI线程处理的话也会引起NetworkOnMainThreadExeception异常,对于这些情况我们就需要开启新的线程来处理。
  • Neacy_Zz
  • Neacy_Zz
  • 2015-12-06 20:26
  • 1170

Android Handler 四个使用实例 及HandlerThread的使用

当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程),主线程为管理界面中的UI控件,进行事件分发,比如说:点击一个Button,Android会分发事件到Button上,来响应你的操作。如果此时需要一个耗时的操作。例如: 联网读取数据,或者读取本地较大的一个文件的时候,你不能把这...
  • a78270528
  • a78270528
  • 2015-09-06 17:49
  • 2279

HandlerThread的使用以及原理

HandlerThread 如果已经理解Handler,Loop,MessageQueue的工作原理看此篇文章会非常简单,若没有了解的读者,可以看下面的文章: Handler类和Handler,Loop,MessageQueue的工作原理 首先我们先看一下官方的描述: Handy cl...
  • Double2hao
  • Double2hao
  • 2017-02-28 16:19
  • 4819

Android HandlerThread 源码分析

HandlerThread 简介:我们知道Thread线程是一次性消费品,当Thread线程执行完一个耗时的任务之后,线程就会被自动销毁了。如果此时我又有一个耗时任务需要执行,我们不得不重新创建线程去执行该耗时任务。然而,这样就存在一个性能问题:多次创建和销毁线程是很耗系统资源的。为了解这种问题,...
  • feidu804677682
  • feidu804677682
  • 2015-07-11 12:33
  • 14198
    个人资料
    • 访问:5765次
    • 积分:124
    • 等级:
    • 排名:千里之外
    • 原创:4篇
    • 转载:15篇
    • 译文:0篇
    • 评论:2条
    最新评论