您的位置:首页 > 移动开发 > Android开发

Android多线程编程之HandlerThread学习篇(四)

2016-06-14 14:18 357 查看

Android多线程编程之HandlerThread学习篇(四)

一、介绍

之前学习了Handler、IntentService以及线程池等内容后,再来看HandlerThread,就显得相对比较简单了,HandlerThread其实就是一个线程,只不过是它可以直接使用Handler的线程。HandlerThread在内部创建了消息队列。

下面简要举例说明一下如何使用HandlerThread:

mHandlerThread = new HandlerThread("jkYishon-HandlerThread");
mHandlerThread.start();

mHandler = new Handler(mHandlerThread.getLooper()) {
@Override
public void handleMessage(Message msg) {
//模拟耗时任务
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.v("mHandler", "handleMessage");
}
};
mHandler.sendEmptyMessage(0);


二、工作原理

HandlerThread在初始化的时候只是初始化了线程的名称以及线程的优先级。而在启动这个线程时,最主要是看run方法中的所做的事情。

public void run() {
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}


在run方法中初始化了Looper对象,并且也初始化了消息队列等。onLooperPrepared主要是在执行消息循环之前所需要做的一些事情。而在初始化Handler的时候会用HandlerThread的getLooper方法获取。

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;
}


其中run方法中的同步代码块中的notifyAll和getLooper方法中同步代码块中的wait方法是为了m初始化Handler的时候传入的参数Looper保证mHandlerThread在run方法中以及初始化了Looper对象。因为一个是在HandlerThread线程中初始化,而获取Looper对象是在UI主线程中获取,就必须保持线程同步,因而在此采用了这样的方式。

当Handler发送消息的时候,会将消息传给消息队列,而在HandlerThread中的run方法中调用的Looper.loop()可以无限从消息队列中取消息,那么之后Handler处理消息。在handleMessage中执行的代码其实是在HandlerThread线程中执行的。

另外需要注意的是,因为HandlerThread中的run方法中会不断无限循环取消息,那么在没有消息的时候会阻塞线程的执行。所以在没有任务需要处理的时候,则需要调用quit()或quitSafty()方法退出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 多线程