java handlerthread_HandlerThread: HandlerThread的理解

Android为了方便对Thread和Handler进行封装,也就是HandlerThread。HandlerThread继承自Thread,说白了就是Thread加上一个Looper。源码:

f848269fa006e2052904f89d85de344b.png

可以看到其本身便持有一个Looper对象。

之前学习的时候有两个疑问:

1. HandlerThread为什么start完了之后不会退出?

一般我们都是在某个方法里(如onCreate)调用start方法来启动HandlerThread:

mWorkThread = new HandlerThread("workThread");

mWorkThread.start();

那岂不是在调用完start方法之后就退出了?那这有什么意义,如果是一个普通的线程:

Thread thread = newThread();

thread.start();

在调用完start()方法之后肯定会退出的。

查看HandlerThread源码:

@Overridepublic voidrun() {

mTid=Process.myTid();

Looper.prepare();synchronized (this) {

mLooper=Looper.myLooper();

notifyAll();

}

Process.setThreadPriority(mPriority);

onLooperPrepared();

Looper.loop();

mTid= -1;

}

当调用完start()方法后系统会自动调用run()方法,run方法里有一个 Looper.loop();

93b5b97dc15035288bf279cc4f169caa.png

可以看到这个looper方法里有一个死循环,它也是跑在run方法里的,所以HandlerThread在start()完了之后不会立即退出。

2. Handler里的handlerMessage()方法究竟运行于哪个线程?

handlerMessage()方法究竟运行于哪个线程,得看这个方法在哪个线程里被调用,之前分析过handlerMessage是在Looper的loop()方法里辗转被调用的。

Looper#loop()

2057e2c7ec7f3177d8ebc752f474359e.png

Handler#dispatchMessage()

597b2c6c469930a7718848531678417e.png

那其实可以这样说,Looper.loop()方法跑在哪个线程,handlerMessage就跑在哪个线程。

对于自定义的Thread+Looper方式:

class LooperThread extendsThread {publicHandler mHandler;public voidrun() {

Looper.prepare();

mHandler= newHandler() {public voidhandleMessage(Message msg) {//process incoming messages here

}

};

Looper.loop();

}

}

很明显,handlerMessage()方法跑在子线程。

对于HandlerThread方式:

HandlerThread#run()

@Overridepublic voidrun() {

mTid=Process.myTid();

Looper.prepare();synchronized (this) {

mLooper=Looper.myLooper();

notifyAll();

}

Process.setThreadPriority(mPriority);

onLooperPrepared();

Looper.loop();

mTid= -1;

}

也是跑在子线程。

对于mHandler = new Handler()方式:

虽然未传Looper, 但默认使用的是主线程的Looper, 所以此时handlerMessage跑在主线程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值