本文首先解释一下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 = ;
// 将消息发送给UI中的handler处理
handler.sendMessage(msg);
super.run();
}
}

现在线程中的消息发送出去了。我们再到UI线程中处理这个消息。代码如下:

    /**
* 继承了callback后,必须要实现这个方法。即上面那个handler的处理都在这里进行
*/
@Override
public boolean handleMessage(Message msg)
{
// 通过判断msg.what来判断到底是哪个"事件"要进行处理
switch (msg.what)
{
case :
progressBar.setVisibility(View.GONE);
// 拿出msg中的数据并显示出来
Bundle bundle = msg.getData();
tvResult.setText(bundle.getString("answer"));
break; default:
break;
}
return false;
}

这样我们就可以看到当第二个activity显示一段时间后网页才显示出来,并没有出现卡死的情况!

最后再来梳理下多线程处理的步骤:

Android Handler与多线程的更多相关文章

  1. Android Handler使用实例

    本文主要介绍Android中Handler的简单使用方法,Handler跟多线程,消息队列联系很紧密,在平常的实际程序开发中比较常见.本文分为4个简单的例子来学校handler Handler使用例1 ...

  2. 详解Android Handler的使用-别说你不懂handler

    我们进行Android开发时,Handler可以说是使用非常频繁的一个概念,它的用处不言而喻.本文就详细介绍Handler的基本概念和用法. Handler的基本概念         Handler主 ...

  3. 详解Android Handler的使用

    我们进行Android开发时,Handler可以说是使用非常频繁的一个概念,它的用处不言而喻.本文就详细介绍Handler的基本概念和用法. Handler的基本概念         Handler主 ...

  4. Android Learning:多线程与异步消息处理机制

    在最近学习Android项目源码的过程中,遇到了很多多线程以及异步消息处理的机制.由于之前对这块的知识只是浅尝辄止,并没有系统的理解.但是工程中反复出现让我意识到这个知识的重要性.所以我整理出这篇博客 ...

  5. 详解Android Handler的使用-别说你不懂handler(转)

    我们进行Android开发时,Handler可以说是使用非常频繁的一个概念,它的用处不言而喻.本文就详细介绍Handler的基本概念和用法. Handler的基本概念         Handler主 ...

  6. Android四个多线程分析:MessageQueue实现

    Android四个多线程分析:MessageQueue的实现 罗朝辉 (http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 在前面两篇文章<Android多线 ...

  7. Android中的多线程【转】

    感谢大佬:https://www.cnblogs.com/zoe-mine/p/7954605.html 感谢大佬:https://blog.csdn.net/u014555121/article/d ...

  8. Android Handler leak 分析及解决办法

    In Android, Handler classes should be static or leaks might occur, Messages enqueued on the applicat ...

  9. Android Handler练习

    package com.example.myact12; import java.util.Random; import android.support.v7.app.ActionBarActivit ...

随机推荐

  1. Spark菜鸟学习营Day3 RDD编程进阶

    Spark菜鸟学习营Day3 RDD编程进阶 RDD代码简化 对于昨天练习的代码,我们可以从几个方面来简化: 使用fluent风格写法,可以减少对于中间变量的定义. 使用lambda表示式来替换对象写 ...

  2. 使用virtualenv或zc.buildout创建Python-tornado分离环境

    originally created by shuliang under CC BY-NC-ND 3.0 license 一.引言 学习编程,好比练功,总得先有个环境,搭台子是必须的.为了照顾初学者, ...

  3. C# 获得手机归属地功能

    今天通过查资料了解到web的页面抓取功能,应用HttpWebRequest和HttpWebResponse功能,从http://www.showji.com网站中抓取归属地信息 应该说这个方法是从别的 ...

  4. mariadb 10 多源复制(Multi-source replication) 业务使用场景分析,及使用方法

    mariadb 10 多源复制(Multi-source replication) 业务使用场景分析,及使用方法 官方mysql一个slave只能对应一个master,mariadb 10开始支持多源 ...

  5. SSMS 2008R2没有智能感知方法解决

    有时SSMS会莫明奇妙的没有了智能感知(前一天还是有的, 第2天就没有了) 在网上查到有如下原因: 1. 服务器上有Offline的DB 解决方案: 将Offline的DB删掉或者设成online即可 ...

  6. c#之委托和事件的区别

    1.什么是委托,这里就不做介绍了,如果想了解可以查看博客:http://www.cnblogs.com/xiaoxiaogogo/p/3571494.html 下面开始对事件进行介绍 1.定义事件以及 ...

  7. [转载+原创]Emgu CV on C# (六) —— Emgu CV on Canny边缘检测

    Canny边缘检测也是一种边缘检测方法,本文介绍了Canny边缘检测的函数及其使用方法,并利用emgucv方法将轮廓检测解算的结果与原文进行比较. 图像的边缘检测的原理是检测出图像中所有灰度值变化较大 ...

  8. 被git extensions给坑了,Not owner 解决办法

    我只遇到这一种情况,不能访问git文件主库, 清空以前的历史文件,包括默认配置文件,重新安装一遍git extension,然后设置账号和密码, 在打开bash设置私钥和公钥 把公钥添加到你的git的 ...

  9. [resource-]Python 网页爬虫 & 文本处理 & 科学计算 & 机器学习 & 数据挖掘兵器谱

    reference: http://www.52nlp.cn/python-%e7%bd%91%e9%a1%b5%e7%88%ac%e8%99%ab-%e6%96%87%e6%9c%ac%e5%a4% ...

  10. [bzoj 3031] 理科男

    题意 给定一个进制分数 求是否是循环小数,且求出循环节长度 题解 暴力 il int find(int p){ int head=last[p%mod]; while(head&&pr ...