大家好,又见面了,我是你们的朋友全栈君。
本文我们将学习HandlerThread的实现原理,以及开发时,如何正确的使用它来实现我们的开发任务。
设想这样一个场景:我们要在一个线程A中处理业务逻辑,在另一个线程B中,监听A的执行,并进行结果处理。这时我们使用HandlerThread就可以非常简单的实现该功能了。
通常我们的线程交互场景,都是UI线程中启动子线程,并且由子线程完成工作任务,最终结果交给UI线程。现在我们的使用场景是,在子线程中监控其他线程的执行结果(这里的其他线程可以是另一个子线程,也可以是UI线程),并在子线程中进行结果的处理。
通过描述,我们可以得出2点结论:第一,这个过程中,需要存在2个线程;第二,这两个线程需要进行数据传输(交互)。那么,我们很自然的就想到了Handler机制来实现该功能,但是我们自己在一个子线程中,使用Handler稍显麻烦一些,HandlerThread内置了Handler,简化了我们的操作。
public class HandlerThread extends Thread {
int mPriority;
int mTid = -1;
Looper mLooper;
private @Nullable Handler mHandler;
public HandlerThread(String name) {//构造函数1
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) {//构造函数2
super(name);
mPriority = priority;
}
}
@Override
public void run() {
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}
public Looper getLooper() {
if (!isAlive()) {//判断线程是否存活
return null;
}
// If the thread has been started, wait until the looper has been created.
synchronized (this) {
//如果线程存活,但mLooper没有创建完成,则等待
while (isAlive() && mLooper == null) {
try {
wait();
} catch (InterruptedException e) {
}
}
}
return mLooper;//返回当前线程的Looper对象
}
/**
* @return a shared {@link Handler} associated with this thread
* @hide
*/
public 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;
}
当不需要HandlerThread时,需要调用quit方法或quitSafely方法结束线程管理的Looper消息循环。
HandlerThread的实现其实并不复杂,我们以一个简单Demo来看它的使用。
public class HandlerThreadTest {
private final static String TAG = "budaye";
public static final int HT_MSG = 1;
private HandlerThread mHandlerThread = new HandlerThread("myHandlerThread", Process.THREAD_PRIORITY_BACKGROUND);
private Handler mHandler = null;
public void startHandlerthread(){
mHandlerThread.start();
if (mHandler == null){
mHandler = new Handler(mHandlerThread.getLooper()){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
switch (msg.what){
case HT_MSG:
Log.d(TAG, "当前线程:" + Thread.currentThread());
Log.d(TAG, "收到其他线程发送过来的消息了");
break;
}
}
};
}
}
public void sendMessage() {
Log.d(TAG, "当前线程:" + Thread.currentThread());
Message msg = Message.obtain();
msg.what = HT_MSG;
mHandler.sendMessage(msg);
}
}
25208-25208/com.example.simpledemo D/budaye: 当前线程:Thread[main,5,main]
25208-25284/com.example.simpledemo D/budaye: 当前线程:Thread[myHandlerThread,5,main]
25208-25284/com.example.simpledemo D/budaye: 收到其他线程发送过来的消息了
我们分别在2个线程中输出了日志。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/215481.html原文链接:https://javaforall.cn