介绍
首先我们来看看为什么我们要使用HandlerThread?在我们的应用程序当中为了实现同时完成多个任务,所以我们会在应用程序当中创建多个线程。为了让多个线程之间能够方便的通信,我们会使用Handler实现线程间的通信。
下面我们看看如何在线程当中实例化Handler。
在线程中实例化Handler我们需要保证线程当中包含Looper(注意:UI-Thread默认包含Looper)。
为线程创建Looper的方法如下:在线程run()方法当中先调用Looper.prepare()初始化Looper,然后再run()方法最后调用Looper.loop(),这样我们就在该线程当中创建好Looper。(注意:Looper.loop()方法默认是死循环)
我们实现Looper有没有更加简单的方法呢?当然有,这就是我们的HandlerThread。我们来看下Android对HandlerThread的描述:
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的文档比较简单,但是它的使用并没有想象的那么easy。
创建一个HandlerThread,即创建了一个包含Looper的线程。
HandlerThread handlerThread = new HandlerThread("leochin.com");
handlerThread.start(); //创建HandlerThread后一定要记得start()
获取HandlerThread的Looper
Looper looper = handlerThread.getLooper();
创建Handler,通过Looper初始化
Handler handler = new Handler(looper);
通过以上三步我们就成功创建HandlerThread。通过handler发送消息,就会在子线程中执行。
如果想让HandlerThread退出,则需要调用handlerThread.quit();。
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.View;
public class MainActivity extends Activity {
/**
*
* 程序说明:
* UI Thread 通过handler向其他线程发送数据并进行打印
*
*/
private Handler superHandler;
private Handler normalHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
NormalThread normalThread = new NormalThread();
normalThread.start();
HandlerThread handlerThread = new HandlerThread("leochin.com");
handlerThread.start();
/*
* 将handlerThread中创建的looper传递给Handler。
*
* 也就意味着该Handler收到Message后,程序在HandlerThread创建的线程中运行
*
*/
superHandler = new Handler(handlerThread.getLooper()){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
int what = msg.what;
if(what == 2){
Log.d("wenhao",Thread.currentThread().getName()+" HandlerThread is OK");
}
}
};
}
/**
*
* 普通线程
*
*/
class NormalThread extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
Looper.prepare();
normalHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
int what = msg.what;
if(what == 1){
Log.d("wenhao",Thread.currentThread().getName()+ " NormalThread is OK");
}
}
};
Looper.loop();
}
}
/**
*
* 向普通线程发送数据
*
* @param view
*/
public void normalThreadUse(View view){
if(normalHandler == null){
return;
}
normalHandler.sendEmptyMessage(1);
}
/**
*
* 向HandlerThread发送数据
*
* @param view
*/
public void handlerThreadUse(View view){
if(superHandler == null){
return;
}
superHandler.sendEmptyMessage(2);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}