HandlerThread源码分析,androidjetpack视频

  1. 使用HandlerThread

转载请注明原博客地址:

本篇博客主要讲解HandlerThread,关于线程池的原理,请自行了解。

本篇博客主要讲解一下问题

  1. HandlerThread的使用场景以及怎样使用HandlerThread?

  2. HandlerThread源码分析

HandlerThread的使用场景以及怎样使用HandlerThread?


使用场景

HandlerThread是Google帮我们封装好的,可以用来执行多个耗时操作,而不需要多次开启线程,里面是采用handler和Looper实现的

Handy class for starting a new thread that has a looper. The looper can then be used to create handler classes. Note that start() must still be called.

怎样使用HandlerThread?

  1. 创建HandlerThread的实例对象

HandlerThread handlerThread = new HandlerThread(“myHandlerThread”);

该参数表示线程的名字,可以随便选择。

2. 启动我们创建的HandlerThread线程

handlerThread.start();

  1. 将我们的handlerThread与Handler绑定在一起。

还记得是怎样将Handler与线程对象绑定在一起的吗?其实很简单,就是将线程的looper与Handler绑定在一起,代码如下:

mThreadHandler = new Handler(mHandlerThread.getLooper()) {

@Override

public void handleMessage(Message msg) {

checkForUpdate();

if(isUpdate){

mThreadHandler.sendEmptyMessage(MSG_UPDATE_INFO);

}

}

};

注意必须按照以上三个步骤来,下面在讲解源码的时候会分析其原因

完整测试代码如下

public class MainActivity extends AppCompatActivity {

private TextView mTv;

Handler mMainHandler = new Handler();

private Handler mThreadHandler;

private static final int MSG_UPDATE_INFO = 0x100;

private HandlerThread mHandlerThread;

private boolean isUpdate=true;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mTv = (TextView) findViewById(R.id.tv);

initHandlerThread();

}

private void initHandlerThread() {

mHandlerThread = new HandlerThread(“xujun”);

mHandlerThread.start();

mThreadHandler = new Handler(mHandlerThread.getLooper()) {

@Override

public void handleMessage(Message msg) {

checkForUpdate();

if(isUpdate){

mThreadHandler.sendEmptyMessage(MSG_UPDATE_INFO);

}

}

};

}

/**

  • 模拟从服务器解析数据

*/

private void checkForUpdate() {

try {

//模拟耗时

Thread.sleep(1200);

mMainHandler.post(new Runnable() {

@Override

public void run() {

String result = “实时更新中,当前股票行情:%d”;

result = String.format(result, (int) (Math.random() * 5000 + 1000));

mTv.setText(Html.fromHtml(result));

}

});

} catch (InterruptedException e) {

e.printStackTrace();

}

}

@Override

protected void onResume() {

isUpdate=true;

super.onResume();

mThreadHandler.sendEmptyMessage(MSG_UPDATE_INFO);

}

@Override

protected void onPause() {

super.onPause();

isUpdate=false;

mThreadHandler.removeMessages(MSG_UPDATE_INFO);

}

@Override

protected void onDestroy() {

super.onDestroy();

mHandlerThread.quit();

mMainHandler.removeCallbacksAndMessages(null);

}

}

运行以上测试代码,将可以看到如下效果图

HandlerThread源码分析,androidjetpack视频


HandlerThread源码分析


* 官方源代码如下,是基于sdk23的,可以看到,只有一百多行代码而已*

public class HandlerThread extends Thread {

int mPriority;

int mTid = -1;

Looper mLooper;

public HandlerThread(String name) {

super(name);

mPriority = Process.THREAD_PRIORITY_DEFAULT;

}

public HandlerThread(String name, int priority) {

super(name);

mPriority = priority;

}

/**

  • Call

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

back method that can be explicitly overridden if needed to execute some

  • setup before Looper loops.

*/

protected void onLooperPrepared() {

}

@Override

public void run() {

mTid = Process.myTid();

Looper.prepare();

//持有锁机制来获得当前线程的Looper对象

synchronized (this) {

mLooper = Looper.myLooper();

//发出通知,当前线程已经创建mLooper对象成功,这里主要是通知getLooper方法中的wait

notifyAll();

}

//设置线程的优先级别

Process.setThreadPriority(mPriority);

//这里默认是空方法的实现,我们可以重写这个方法来做一些线程开始之前的准备,方便扩展

onLooperPrepared();

Looper.loop();

mTid = -1;

}

public Looper getLooper() {

if (!isAlive()) {

return null;

}

// 直到线程创建完Looper之后才能获得Looper对象,Looper未创建成功,阻塞

synchronized (this) {

while (isAlive() && mLooper == null) {

try {

wait();

} catch (InterruptedException e) {

}

}

}

return mLooper;

}

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;

}

}

1)首先我们先来看一下它的构造方法

public HandlerThread(String name) {

super(name);

mPriority = Process.THREAD_PRIORITY_DEFAULT;

}

public HandlerThread(String name, int priority) {

super(name);

mPriority = priority;

}

有两个构造方法,一个参数的和两个参数的,name代表当前线程的名称,priority为线程的优先级别

2)接着我们来看一下run()方法,在run方法里面我们可以看到我们会初始化一个Looper,并设置线程的优先级别

public void run() {

mTid = Process.myTid();

Looper.prepare();

//持有锁机制来获得当前线程的Looper对象

synchronized (this) {

mLooper = Looper.myLooper();

下它的构造方法

public HandlerThread(String name) {

super(name);

mPriority = Process.THREAD_PRIORITY_DEFAULT;

}

public HandlerThread(String name, int priority) {

super(name);

mPriority = priority;

}

有两个构造方法,一个参数的和两个参数的,name代表当前线程的名称,priority为线程的优先级别

2)接着我们来看一下run()方法,在run方法里面我们可以看到我们会初始化一个Looper,并设置线程的优先级别

public void run() {

mTid = Process.myTid();

Looper.prepare();

//持有锁机制来获得当前线程的Looper对象

synchronized (this) {

mLooper = Looper.myLooper();

上一篇:Handler面试那些事


下一篇:FrameWork内核解析之Handler消息机制(二),android学习视频