Android HandlerThread分析
之前Handler 分析的文章有分析过,子线程Thread中是不能直接使用Handler的,需要调用Looper.prepare()方法,因此Android就为我们提供了Handler和Thread结合的方法HandlerThread方法,我们先来看下HandlerThread的源码:
public class HandlerThread extends Thread {int mPriority;int mTid = -1;Looper mLooper;private @Nullable Handler mHandler;public HandlerThread(String name) {super(name);mPriority = Process.THREAD_PRIORITY_DEFAULT;}/*** Constructs a HandlerThread.* @param name* @param priority The priority to run the thread at. The value supplied must be from* {@link android.os.Process} and not from java.lang.Thread.*/public HandlerThread(String name, int priority) {super(name);mPriority = priority;}/*** Call back method that can be explicitly overridden if needed to execute some* setup before Looper loops.*/protected void onLooperPrepared() {}@Overridepublic void run() {mTid = Process.myTid();Looper.prepare();synchronized (this) {mLooper = Looper.myLooper();notifyAll();}Process.setThreadPriority(mPriority);onLooperPrepared();Looper.loop();mTid = -1;}/*** This method returns the Looper associated with this thread. If this thread not been started* or for any reason isAlive() returns false, this method will return null. If this thread* has been started, this method will block until the looper has been initialized.* @return The looper.*/public Looper getLooper() {if (!isAlive()) {return null;}// If the thread has been started, wait until the looper has been created.synchronized (this) {while (isAlive() && mLooper == null) {try {wait();} catch (InterruptedException e) {}}}return mLooper;}/*** @return a shared {@link Handler} associated with this thread* @hide*/@NonNullpublic Handler getThreadHandler() {if (mHandler == null) {mHandler = new Handler(getLooper());}return mHandler;}public boolean quit() {Looper looper = getLooper();if (looper != null) {looper.quit();return true;}return false;}public boolean quitSafely() {Looper looper = getLooper();if (looper != null) {looper.quitSafely();return true;}return false;}/*** Returns the identifier of this thread. See Process.myTid().*/public int getThreadId() {return mTid;}
}
很简单的源码HandlerThread继承Thread主要看:
@Overridepublic void run() {mTid = Process.myTid();Looper.prepare();//手动为子线程创建了loopersynchronized (this) {mLooper = Looper.myLooper();notifyAll();}Process.setThreadPriority(mPriority);onLooperPrepared();Looper.loop();//开始轮询mTid = -1;}
可以看到run方法中为子线程创建了looper,并把对象放到线程中,然后通过Looper.loop();开启循环消息。
其他方法:
getThreadHandler: 获取当前线程的handler
quit:清空所有消息
quitSafely:只情况延时消息
getLooper:获取线程中的looper对象
我们看下HandlerThread的使用:
private void startThread(){HandlerThread handlerThread = new HandlerThread("thread_one");handlerThread.start();workHandler = new Handler(handlerThread.getLooper()){//子线程handler@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);try {Thread.sleep(1000);//子线程中处理耗时操作mainHandler.sendEmptyMessage(0);//处理完后发送消息给主线程更新UI}catch (Exception e){}}};workHandler.sendEmptyMessage(0);mainHandler = new Handler(){//主线程handler@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);mBtn.setText("start");//主线程中更新UI}};
}
例子中我们看到我们通过handlerThread.getLooper()获取子线程的looper然后与workHandler,我们知道handler的线程是依赖与与之关联的looper线程,所以workHandler是子线程的handler.
然后我们new 一个未传looper的handler,默认与主线程关联,所以mainHandler是主线程的handler.
Android HandlerThread分析相关推荐
- Android多线程分析之二:Thread的实现
Android多线程分析之二:Thread的实现 罗朝辉 (http://www.cnblogs.com/kesalin/) CC 许可,转载请注明出处 在前文<Android多线程分析之一:使 ...
- Android Telephony分析(三) ---- RILJ详解
前言 本文主要讲解RILJ工作原理,以便更好地分析代码,分析业务的流程. 这里说的RILJ指的是RIL.java (frameworks\opt\telephony\src\java\com\And ...
- Android多线程分析之三:Handler,Looper的实现
Android多线程分析之三:Handler,Looper的实现 罗朝辉 (http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 在前文<Android多线程分 ...
- android c++ 线程,Android多线程分析之二:Thread的实现
Android多线程分析之二:Thread的实现在前文<Android多线程分析之一:使用Thread异步下载图像>中演示了如何使用 Thread 处理异步事务.示例中这个 Java Th ...
- android逆向分析概述_Android存储概述
android逆向分析概述 Storage is this thing we are all aware of, but always take for granted. Not long ago, ...
- Android JNI入门第五篇——Android.mk分析
转载请标明出处: http://blog.csdn.net/michael1112/article/details/56671708 江东橘子的博客 Android.mk文件是在使用NDK编译C代码时 ...
- Android内存分析和调优(上)
Android内存分析和调优(上) Android内存分析和调优(上) Android内存分析工具(四):adb命令 posted on 2017-09-25 19:29 时空观察者9号 阅读(... ...
- Android Telephony分析(七) ---- 接口扩展(异步转同步)
本文是基于上一篇<Android Telephony分析(六) -- 接口扩展(实践篇)>来写的. 上一篇介绍的接口扩展的方法需要实现两部分代码: 1. 从APP至RIL,发送请求: ...
- Android Telephony分析(六) ---- 接口扩展(实践篇)
本文将结合前面五篇文章所讲解的知识,综合起来,实现一个接口扩展的功能. 如果还没有阅读过前面五篇文章的内容,请先阅读: <Android Telephony分析(一) - Phone详解 & ...
最新文章
- 条件选择结构:星期计划(switch)
- java内存区域与内存溢出异常_Java内存区域与内存溢出异常
- python 进程池pool简单实例
- JavaScript学习总结二:js闭包(Closure)概念
- flutter实现(OutlineButton)线框按钮
- android后台截屏实现(2)--screencap源码修改
- 1874: 生活大爆炸版石头剪刀布
- mac php5.6.30与php7共存,认识Homebrew以及在Mac上同时安装PHP5及PHP7
- Mysql中常用的函数汇总
- fatal error C1853 预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)
- python自学网站-python自学网站
- CRC-16的原理和实现
- linux编辑器终端,分享|尝试将 Jed 作为你的 Linux 终端文本编辑器
- 电子科技大学《图论及其应用》复习总结--第一章 图的基本概念
- Cleanup failed to process the following paths错误的解决
- c fflush函数
- 钱包开发经验分享:BTC篇
- 摄像头安装指南( spca5xx)
- python语言的标准库有哪些,python标准库函数有哪些
- 分布式服务框架 dubbo/dubbox 入门示例(2)