html5中文学习网

您的位置: 首页 > android » 正文

Android中的Handler与多线程应用实例_Android

[ ] 已经帮助:人解决问题

本文首先解释一下handler是用来干嘛的,然后通过例子介绍其在多线程中的应用。dS7HTML5中文学习网 - HTML5先行者学习网

什么是HandlerdS7HTML5中文学习网 - HTML5先行者学习网

handler通俗一点讲就是用来在各个进程之间发送数据的处理对象。在任何进程中,只要获得了另一个进程的handler则可以通过handler.sendMessage(message)方法向那个进程发送数据。基于这个机制,我们在处理多线程的时候可以新建一个thread,这个thread拥有UI线程中的一个handler。当thread处理完一些耗时的操作后通过传递过来的handler像ui线程发送数据,由UI线程去更新界面。dS7HTML5中文学习网 - HTML5先行者学习网

handler应用多线程例子dS7HTML5中文学习网 - HTML5先行者学习网

我们这个例子是实现一个简单的词典功能。在获取网页过程中应用线程。这个程序共有两个activity,第一个用于输入查询的单词,第二个activity用于显示结果。我们直接看第二个activity的内容。(第一个activity无非是获得用户输入的单词然后传给activity2,还没有掌握的可以看我前面的文章)dS7HTML5中文学习网 - HTML5先行者学习网

首先来看OnCreate:dS7HTML5中文学习网 - HTML5先行者学习网

复制代码 代码如下:
dS7HTML5中文学习网 - HTML5先行者学习网
@OverridedS7HTML5中文学习网 - HTML5先行者学习网
 protected void onCreate(Bundle savedInstanceState)dS7HTML5中文学习网 - HTML5先行者学习网
 {dS7HTML5中文学习网 - HTML5先行者学习网
  super.onCreate(savedInstanceState);dS7HTML5中文学习网 - HTML5先行者学习网
  setContentView(R.layout.queryresult);dS7HTML5中文学习网 - HTML5先行者学习网

  tvResult = (TextView) findViewById(R.id.tvResult);dS7HTML5中文学习网 - HTML5先行者学习网
  String queryString = getIntent().getStringExtra("query");dS7HTML5中文学习网 - HTML5先行者学习网

  Log.d("threadId:", String.valueOf(Thread.currentThread().getId()));dS7HTML5中文学习网 - HTML5先行者学习网

  // 声明一个handler,它的处理程序是实现了callback的类,这里我将这个activity继承了dS7HTML5中文学习网 - HTML5先行者学习网
  // callback,所以可以传入this。dS7HTML5中文学习网 - HTML5先行者学习网
  handler = new Handler(this);dS7HTML5中文学习网 - HTML5先行者学习网
  // 新建一个线程(我们自己实现的线程),将上面的handler和查询的单词传入构造函数dS7HTML5中文学习网 - HTML5先行者学习网
  GetHtmlThread thread = new GetHtmlThread(handler, getIntent()dS7HTML5中文学习网 - HTML5先行者学习网
    .getStringExtra("query"));dS7HTML5中文学习网 - HTML5先行者学习网
  // 开始线程dS7HTML5中文学习网 - HTML5先行者学习网
  thread.start();dS7HTML5中文学习网 - HTML5先行者学习网

  progressBar = (ProgressBar) findViewById(R.id.prb);dS7HTML5中文学习网 - HTML5先行者学习网
  progressBar.setVisibility(View.VISIBLE);dS7HTML5中文学习网 - HTML5先行者学习网
 }dS7HTML5中文学习网 - HTML5先行者学习网

dS7HTML5中文学习网 - HTML5先行者学习网

一些必要的注释我已经在代码注明了。代码中的那个GetHtmlThread线程是继承于Thread的一个类,然后自己实现里面的run方法,这个和c#里面不一样。感觉还是c#里面好理解一点。那我们就看看这个GetHtmlThread类:dS7HTML5中文学习网 - HTML5先行者学习网

复制代码 代码如下:
dS7HTML5中文学习网 - HTML5先行者学习网
public class GetHtmlThread extends ThreaddS7HTML5中文学习网 - HTML5先行者学习网
 {dS7HTML5中文学习网 - HTML5先行者学习网

  private Handler handler; // 传入的handlerdS7HTML5中文学习网 - HTML5先行者学习网
  String queryKey; // 要查询的单词dS7HTML5中文学习网 - HTML5先行者学习网

  public GetHtmlThread(Handler handler, String queryKey)dS7HTML5中文学习网 - HTML5先行者学习网
  {dS7HTML5中文学习网 - HTML5先行者学习网
   this.handler = handler;dS7HTML5中文学习网 - HTML5先行者学习网
   this.queryKey = queryKey;dS7HTML5中文学习网 - HTML5先行者学习网
  }dS7HTML5中文学习网 - HTML5先行者学习网

  @OverridedS7HTML5中文学习网 - HTML5先行者学习网
  public void run() // 线程处理的内容dS7HTML5中文学习网 - HTML5先行者学习网
  {dS7HTML5中文学习网 - HTML5先行者学习网
   // 获得网页中关于这个词的解释,返回的网页内容dS7HTML5中文学习网 - HTML5先行者学习网
   String a = GetTranslateHtml(queryKey);dS7HTML5中文学习网 - HTML5先行者学习网

   // 定义一个消息,用于发给UI线程的handler处理dS7HTML5中文学习网 - HTML5先行者学习网
   Message msg = new Message();dS7HTML5中文学习网 - HTML5先行者学习网
   Bundle bundle = new Bundle();dS7HTML5中文学习网 - HTML5先行者学习网
   // 将查询的结果放进msg中dS7HTML5中文学习网 - HTML5先行者学习网
   bundle.putString("answer", a);dS7HTML5中文学习网 - HTML5先行者学习网
   msg.setData(bundle);dS7HTML5中文学习网 - HTML5先行者学习网
   // 设置这个msg的标识,这样UI中的handler才能根据这个更改对应的UIdS7HTML5中文学习网 - HTML5先行者学习网
   msg.what = 0;dS7HTML5中文学习网 - HTML5先行者学习网
   // 将消息发送给UI中的handler处理dS7HTML5中文学习网 - HTML5先行者学习网
   handler.sendMessage(msg);dS7HTML5中文学习网 - HTML5先行者学习网
   super.run();dS7HTML5中文学习网 - HTML5先行者学习网
  }dS7HTML5中文学习网 - HTML5先行者学习网
 }dS7HTML5中文学习网 - HTML5先行者学习网

dS7HTML5中文学习网 - HTML5先行者学习网

现在线程中的消息发送出去了。我们再到UI线程中处理这个消息。代码如下:dS7HTML5中文学习网 - HTML5先行者学习网

复制代码 代码如下:
dS7HTML5中文学习网 - HTML5先行者学习网
/**dS7HTML5中文学习网 - HTML5先行者学习网
  * 继承了callback后,必须要实现这个方法。即上面那个handler的处理都在这里进行dS7HTML5中文学习网 - HTML5先行者学习网
  */dS7HTML5中文学习网 - HTML5先行者学习网
 @OverridedS7HTML5中文学习网 - HTML5先行者学习网
 public boolean handleMessage(Message msg)dS7HTML5中文学习网 - HTML5先行者学习网
 {dS7HTML5中文学习网 - HTML5先行者学习网
  // 通过判断msg.what来判断到底是哪个"事件"要进行处理dS7HTML5中文学习网 - HTML5先行者学习网
  switch (msg.what)dS7HTML5中文学习网 - HTML5先行者学习网
  {dS7HTML5中文学习网 - HTML5先行者学习网
   case 0:dS7HTML5中文学习网 - HTML5先行者学习网
    progressBar.setVisibility(View.GONE);dS7HTML5中文学习网 - HTML5先行者学习网
    // 拿出msg中的数据并显示出来dS7HTML5中文学习网 - HTML5先行者学习网
    Bundle bundle = msg.getData();dS7HTML5中文学习网 - HTML5先行者学习网
    tvResult.setText(bundle.getString("answer"));dS7HTML5中文学习网 - HTML5先行者学习网
    break;dS7HTML5中文学习网 - HTML5先行者学习网

   default:dS7HTML5中文学习网 - HTML5先行者学习网
    break;dS7HTML5中文学习网 - HTML5先行者学习网
  }dS7HTML5中文学习网 - HTML5先行者学习网
  return false;dS7HTML5中文学习网 - HTML5先行者学习网
 }dS7HTML5中文学习网 - HTML5先行者学习网

dS7HTML5中文学习网 - HTML5先行者学习网

这样我们就可以看到当第二个activity显示一段时间后网页才显示出来,并没有出现卡死的情况!dS7HTML5中文学习网 - HTML5先行者学习网

最后再来梳理下多线程处理的步骤:dS7HTML5中文学习网 - HTML5先行者学习网

dS7HTML5中文学习网 - HTML5先行者学习网

Demo下载dS7HTML5中文学习网 - HTML5先行者学习网

(责任编辑:)
推荐书籍
推荐资讯
关于HTML5先行者 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助