Android中的Handler与多线程应用实例
本文首先解释一下handler是用来干嘛的,然后通过例子介绍其在多线程中的应用。
什么是handler
handler通俗一点讲就是用来在各个进程之间发送数据的处理对象。在任何进程中,只要获得了另一个进程的handler则可以通过handler.sendmessage(message)方法向那个进程发送数据。基于这个机制,我们在处理多线程的时候可以新建一个thread,这个thread拥有ui线程中的一个handler。当thread处理完一些耗时的操作后通过传递过来的handler像ui线程发送数据,由ui线程去更新界面。
handler应用多线程例子
我们这个例子是实现一个简单的词典功能。在获取网页过程中应用线程。这个程序共有两个activity,第一个用于输入查询的单词,第二个activity用于显示结果。我们直接看第二个activity的内容。(第一个activity无非是获得用户输入的单词然后传给activity2,还没有掌握的可以看我前面的文章)
首先来看oncreate:
@override
protected void oncreate(bundle savedinstancestate)
{
super.oncreate(savedinstancestate);
setcontentview(r.layout.queryresult);
tvresult = (textview) findviewbyid(r.id.tvresult);
string querystring = getintent().getstringextra("query");
log.d("threadid:", string.valueof(thread.currentthread().getid()));
// 声明一个handler,它的处理程序是实现了callback的类,这里我将这个activity继承了
// callback,所以可以传入this。
handler = new handler(this);
// 新建一个线程(我们自己实现的线程),将上面的handler和查询的单词传入构造函数
gethtmlthread thread = new gethtmlthread(handler, getintent()
.getstringextra("query"));
// 开始线程
thread.start();
progressbar = (progressbar) findviewbyid(r.id.prb);
progressbar.setvisibility(view.visible);
}
一些必要的注释我已经在代码注明了。代码中的那个gethtmlthread线程是继承于thread的一个类,然后自己实现里面的run方法,这个和c#里面不一样。感觉还是c#里面好理解一点。那我们就看看这个gethtmlthread类:
public class gethtmlthread extends thread
{
private handler handler; // 传入的handler
string querykey; // 要查询的单词
public gethtmlthread(handler handler, string querykey)
{
this.handler = handler;
this.querykey = querykey;
}
@override
public void run() // 线程处理的内容
{
// 获得网页中关于这个词的解释,返回的网页内容
string a = gettranslatehtml(querykey);
// 定义一个消息,用于发给ui线程的handler处理
message msg = new message();
bundle bundle = new bundle();
// 将查询的结果放进msg中
bundle.putstring("answer", a);
msg.setdata(bundle);
// 设置这个msg的标识,这样ui中的handler才能根据这个更改对应的ui
msg.what = 0;
// 将消息发送给ui中的handler处理
handler.sendmessage(msg);
super.run();
}
}
现在线程中的消息发送出去了。我们再到ui线程中处理这个消息。代码如下:
/**
* 继承了callback后,必须要实现这个方法。即上面那个handler的处理都在这里进行
*/
@override
public boolean handlemessage(message msg)
{
// 通过判断msg.what来判断到底是哪个"事件"要进行处理
switch (msg.what)
{
case 0:
progressbar.setvisibility(view.gone);
// 拿出msg中的数据并显示出来
bundle bundle = msg.getdata();
tvresult.settext(bundle.getstring("answer"));
break;
default:
break;
}
return false;
}
这样我们就可以看到当第二个activity显示一段时间后网页才显示出来,并没有出现卡死的情况!
最后再来梳理下多线程处理的步骤:
推荐阅读
-
Android多线程处理机制中的Handler使用介绍
-
Android中Handler与Message的简单实例
-
Android中AsyncTask与handler用法实例分析
-
实例解析iOS应用多线程开发中NSthread类的用法
-
Android应用中Back键的监听及处理实例
-
Android 中HttpURLConnection与HttpClient使用的简单实例
-
jQuery与Ajax的应用(jQuery中的Ajax)实例讲解
-
iOS多线程应用开发中自定义NSOperation类的实例解析
-
Android多线程处理机制中的Handler使用介绍
-
Android应用中Back键的监听及处理实例