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

 更新时间:2015年03月28日 12:31:54   投稿:junjie  
这篇文章主要介绍了Android中的Handler与多线程应用实例,本文首先解释一下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显示一段时间后网页才显示出来,并没有出现卡死的情况!

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

Demo下载

相关文章

  • Android实现发送短信验证码倒计时功能示例

    Android实现发送短信验证码倒计时功能示例

    本篇文章主要介绍了Android实现发送短信验证码倒计时功能示例,这里整理了详细的代码,有需要的小伙伴可以参考下。
    2017-03-03
  • 谈谈Android Fragments 详细使用

    谈谈Android Fragments 详细使用

    本篇文章主要介绍了Android Fragments 详细使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • Android Studio3.6新特性之视图绑定ViewBinding使用指南

    Android Studio3.6新特性之视图绑定ViewBinding使用指南

    这篇文章主要介绍了Android Studio3.6新特性之视图绑定ViewBinding使用指南,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • ProgressBar、ProgessDialog-用法(详解)

    ProgressBar、ProgessDialog-用法(详解)

    下面小编就为大家带来一篇ProgressBar、ProgessDialog-用法(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Android 帧动画使用详情

    Android 帧动画使用详情

    这篇文章主要介绍本文介绍使用AnimationDrawable类来实现动画效果,需要的朋友可以参考下文
    2021-08-08
  • Android开发中libs和jinLibs文件夹的作用详解

    Android开发中libs和jinLibs文件夹的作用详解

    这篇文章主要给大家介绍了关于Android开发中libs和jinLibs文件夹的作用的相关资料,文中通过图文及示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-09-09
  • Android下拉列表选项框及指示箭头动画

    Android下拉列表选项框及指示箭头动画

    这篇文章主要为大家详细介绍了Android下拉列表选项框,及指示箭头动画的制作代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • Android实现顶部导航菜单左右滑动效果

    Android实现顶部导航菜单左右滑动效果

    这篇文章主要为大家详细介绍了Android实现顶部导航菜单左右滑动效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • android获取ibeacon列表的方法

    android获取ibeacon列表的方法

    这篇文章主要为大家详细介绍了android获取ibeacon列表的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • Android带进度条的文件上传示例(使用AsyncTask异步任务)

    Android带进度条的文件上传示例(使用AsyncTask异步任务)

    这篇文章主要介绍了Android带进度条的文件上传示例(使用AsyncTask异步任务),使用起来比较方便,将几个方法实现就行,感兴趣的小伙伴们可以参考一下。
    2016-11-11

最新评论