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

Android HandlerThread的使用

2016-08-15 21:29 363 查看

介绍

首先我们来看看为什么我们要使用
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();。

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: