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

本文首先解释一下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下载

时间: 2024-10-28 12:15:09

Android中的Handler与多线程应用实例_Android的相关文章

Android中的指纹识别demo开发实例_Android

 指纹识别是在Android 6.0之后新增的功能,因此在使用的时候需要先判断用户手机的系统版本是否支持指纹识别.另外,实际开发场景中,使用指纹的主要场景有两种: 纯本地使用.即用户在本地完成指纹识别后,不需要将指纹的相关信息给后台. 与后台交互.用户在本地完成指纹识别后,需要将指纹相关的信息传给后台. 由于使用指纹识别功能需要一个加密对象(CryptoObject)该对象一般是由对称加密或者非对称加密获得.上述两种开发场景的实现大同小异,主要区别在于加密过程中密钥的创建和使用,一般来说,纯本地

Android中使用ViewFlipper进行手势切换实例_Android

本文实例讲述了Android中使用ViewFlipper进行手势切换的方法,分享给大家供大家参考.具体实现步骤如下: 首先在layout的xml文件中定义一个ViewFlipper: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?>  <ViewFlipper xmlns:android="http://schemas.android.com/apk/res/android" 

Android 中使用ExpandableListView 实现分组的实例_Android

 Android 中使用ExpandableListView 实现分组 一个视图显示垂直滚动两级列表中的条目.这不同于列表视图,允许两个层次,类似于QQ的好友分组.要实现这个效果的整体思路为: 1.要给ExpandableListView 设置适配器,那么必须先设置数据源. 2.数据源,就是此处的适配器类,此方法继承了BaseExpandableListAdapter,它是ExpandableListView的一个子类.需要重写里面的多个方法.方法的意思,代码中都有详细的注释.数据源中,用到了自

Android中实现TCP和UDP传输实例_Android

TCP和UDP在网络传输中非常重要,在Android开发中同样重要. 首先我们来看一下什么是TCP和UDP. 什么是TCP? TCP:Transmission Control Protocol 传输控制协议TCP是一种面向连接(连接导向)的.可靠的.基于字节流的运输层(Transport layer)通信协议,由IETF的RFC 793说明(specified).在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能.应用层向TCP层发送用于网间传输的.用8位字节表示的数据流,然后TCP

详解Android中的沉浸式状态栏效果实例_Android

无意间了解到沉浸式状态栏,感觉贼拉的高大上,于是就是试着去了解一下,就有了这篇文章.下面就来了解一下啥叫沉浸式状态栏.传统的手机状态栏是呈现出黑色条状的,有的和手机主界面有很明显的区别.这一样就在一定程度上牺牲了视觉宽度,界面面积变小. Google从android kitkat(Android 4.4)开始,给我们开发者提供了一套能透明的系统ui样式给状态栏和导航栏,这样的话就不用向以前那样每天面对着黑乎乎的上下两条黑栏了,还可以调成跟Activity一样的样式,形成一个完整的主题,和IOS7

在Android中 获取正在运行的Service 实例_Android

public class ServiceList extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView tv = new TextView(this); ActivityManager activityManger = (ActivityManager) getSystemService(ACTIV

Android中实现开机自动启动服务(service)实例_Android

最近在将 HevSocks5Client 移植到 Android 上了,在经过增加 signalfd 和 timerfd 相关的系统调用支持后,就可以直接使用 NDK 编译出 executable 了.直接的 native exectuable 在 Android 系统总还是不太方便用哦.还是做成一个 apk 吧,暂定只写一个 service 并开机自动启用,无 activity 的. Java 中调用 native 程序我选择使用 JNI 方式,直接在 JNI_OnLoad 方法中调用 pth

Android中生成、使用Json数据实例_Android

1.Json的制作 复制代码 代码如下: package com.example.usingjson2;    import org.json.JSONException;  import org.json.JSONObject;    import android.os.Bundle;  import android.app.Activity;    public class MainActivity extends Activity {        @Override      prote

Android中AutoCompleteTextView与TextWatcher结合小实例_Android

AutoCompleteTextView是实现动态匹配输入内容的一种输入框(EditText),如输入"and"时,会提示"Android" 效果图: 实现代码: package com.conowen.test; import android.app.Activity; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import an