当前位置: 首页 > 编程笔记 >

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

王叶五
2023-03-14
本文向大家介绍Android中的Handler与多线程应用实例,包括了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显示一段时间后网页才显示出来,并没有出现卡死的情况!

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

Demo下载

 类似资料:
  • 我想从 GUI 线程设置一个处理程序线程。然后一段时间后,当在GUI上单击一个按钮时,它会运行callHello(),然后向驻留在非GUI线程上的HelloLogger对象发送一条消息,该对象异步记录“Hello World”。我已经尝试了许多事情,有些无限期地阻止,有些从未收到消息,等等。下面的代码或多或少与我得到的一样接近,请有人可以修改它以使其工作吗? 找到的最佳范例: < li >手柄线程

  • 本文向大家介绍Android中AsyncTask与handler用法实例分析,包括了Android中AsyncTask与handler用法实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android中AsyncTask与handler用法。分享给大家供大家参考,具体如下: 首先,我们得明确下一个概念,什么是UI线程。顾名思义,ui线程就是管理着用户界面的那个线程! android

  • 本文向大家介绍Java多线程实战之单例模式与多线程的实例详解,包括了Java多线程实战之单例模式与多线程的实例详解的使用技巧和注意事项,需要的朋友参考一下 1、立即加载/饿汉模式 立即加载/饿汉模式是在类创建的同时已经创建好一个静态的对象供系统使用,不存在线程安全问题 2、延迟加载/懒汉模式 延迟加载/懒汉模式是在调用方法时实例才被创建,在多线程环境下,会出现取出多个实例的情况,与单例模式的初衷是

  • 我在理解应用程序中的多线程时遇到了一个大问题,因此我发现了一个bug。我已经检查了我认为所有的可能性,但我仍然得到各种(有时意想不到的)错误。 也许这里有人能给我建议,我应该做什么。 在我的项目中,我使用了两个外部库: GraphView-为图形绘制提供视图 EventBus-为应用程序组件之间的轻松通信提供接口 至于应用程序,其结构如下: 其思想是,ProcessThread通过事件总线计算数据

  • 9.3.3 多线程编程的应用 线程原本是操作系统中的概念,是操作系统用于实现系统功能的工具。现在线程已演变成为用户程序可使用的工具,广泛用于应用程序设计。 多线程技术主要用于需要并发执行的场合。例如在很多游戏程序中,都需要维持一个动画场景,而玩家可以通过鼠标或键盘来输入操作指令,控制游戏的进行。假如程序只有一个 控制流,则当程序执行到等待用户输入指令的时候,由于用户输入较慢(相对 CPU 速度来

  • 本文向大家介绍python中的多线程实例教程,包括了python中的多线程实例教程的使用技巧和注意事项,需要的朋友参考一下 本文以实例形式较为详细的讲述了Python中多线程的用法,在Python程序设计中有着比较广泛的应用。分享给大家供大家参考之用。具体分析如下: python中关于多线程的操作可以使用thread和threading模块来实现,其中thread模块在Py3中已经改名为_thre