HandlerThread 用法

HandlerThread最大的优势在于引入MessageQueue概念,可以进行多任务队列管理。

  HandlerThread背后只有一个线程,所以任务是串行依次执行的。串行相对于并行来说更安全,各任务之间不会存在多线程安全问题。

  HandlerThread所产生的线程会一直存活,Looper会在该线程中持续的检查MessageQueue,并开启消息处理的循环。这一点和Thread(),AsyncTask都不同,thread实例的重用可以避免线程相关的对象的频繁重建和销毁。 getLooper().quit();来退出这个线程,其实原理很简单,就是改变在消息循环里面标志位,退出整个while循环,使线程执行完毕。

部分 测试代码如下:

public void onCreate(Bundle savedInstanceState) {

Java代码  

  1. super.onCreate(savedInstanceState);
  2. setContentView(R.layout.main);
  3. tv_name = (TextView) findViewById(R.id.tv_name);
  4. btn_name = (Button) findViewById(R.id.btn_name);
  5. Log.i(TAG, "==================main thread:" + Thread.currentThread().getName());
  6. final HandlerThread mHandlerThread = new HandlerThread("handlerThread");
  7. mHandlerThread.start();
  8. // Handler的handlerMessage方法在主线程执行还是在子线程执行,取决于创建Handler时传递给Handler的looper
  9. final MyHandler mHanlder = new MyHandler(mHandlerThread.getLooper());
  10. btn_name.setOnClickListener(new OnClickListener() {
  11. @Override
  12. public void onClick(View v) {
  13. mHanlder.sendEmptyMessage(1);
  14. try {
  15. Thread.sleep(3000);
  16. } catch (InterruptedException e) {
  17. e.printStackTrace();
  18. }
  19. mHandlerThread.getLooper().quit();
  20. }
  21. });
  22. }
  23. class MyHandler extends Handler {
  24. public MyHandler(Looper looper) {
  25. super(looper);
  26. }
  27. @Override
  28. public void handleMessage(Message msg) {
  29. Log.i(TAG, "==================" + Thread.currentThread().getName());
  30. // 输出内容为: ==============handlerThread
  31. //tv_name.setText("hello, this is the first message from handler");
  32. super.handleMessage(msg);
  33. }
  34. }

不过要注意:要想更新界面内容,还是需要使用主线程的Looper,不然的话还是会抛错误。

时间: 2025-01-01 23:09:56

HandlerThread 用法的相关文章

HandlerThread用法

区分Handler和HandlerThread Handler实例可以在主线程创建,也可以在子线程创建.在子线程中创建时通过Looper,以下示例: public class MainActivity extends AppCompatActivity { HandlerThread handlerThread; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceS

android handler HandlerThread 用法

一.Handler Handler在android里负责发送和处理消息.它的主要用途有: 1)按计划发送消息或执行某个Runnanble(使用POST方法): 2)从其他线程中发送来的消息放入消息队列中,避免线程冲突(常见于更新UI线程) 默认情况下,Handler接受的是当前线程下的消息循环实例(使用Handler(Looper looper).Handler(Looper  looper, Handler.Callback callback) 可以指定线程),同时一个消息队列可以被当前线程中

android点滴之HandlerThread的用法

bochs调试的有些命令根据版本好像有变化,我在ubuntu下安装了bochs-2.4.6,发现和bochs-2.3.6命令出现区别,在2.3.6版本支持dump_cpu.info r等命令,在我安装的2.4.6版本中不支持这两个命令,后面在使用bochs的过程中会陆续总结一些2.4.6支持的命令,最简单的方法是通过help来获取,下面先记录一些常用的: r 查看通用寄存器 sreg 查看段寄存器(IDTR被归到这里) creg 查看系统寄存器(CR0等) x 查看内存(线性地址) xp 查看内

Android HandlerThread的用法

HandlerThread 继承自Thread,内部封装了Looper. 首先Handler和HandlerThread的主要区别是:Handler与Activity在同一个线程中,HandlerThread与Activity不在同一个线程,而是别外新的线程中(Handler中不能做耗时的操作). 用法: [java] view plaincopyprint? import android.app.Activity; import android.os.Bundle; import androi

Handler的另外一种用法(HandlerThread)

直接上代码: public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); HandlerThread hThread=new HandlerThread("myThread"); hThread.start(); myhandler myhandler=new myhandler(hThread.getLooper()); Message msg=myhandler.obta

handler与looper的关系及HandlerThread

做了也快2年的android了,发现android的机制还不是很了解,这几天看了一下这方面的介绍,总结一下handler的用法和机制. handler就是用来线程之间通信的,主线程与子线程.一般的用法是,子线程通知ui主线程的handler去刷新ui操作.最近遇到一些人,问能不能主线程去通知子线程的handler. 当然是可以的.贴一个例子 package cc.c; import android.app.Activity; import android.os.Bundle; import an

【安卓笔记】HandlerThread源码剖析

有时候我们需要在应用程序中创建一些常驻的子线程不定期地执行一些计算型任务,这时候可以考虑使用HandlerThread,它具有创建带消息循环的子线程的作用. 一.HanderThread使用示例 先熟悉下HandlerThread的一般用法.我们创建一个如下所示的Activity: package com.example.handlethreaddemo; import android.app.Activity; import android.os.Bundle; import android.

Android 源码系列之<七>从源码的角度深入理解IntentService及HandlerThread

转载请注明出处:http://blog.csdn.net/llew2011/article/details/51373243 提起Service大家都很熟悉,它乃Android四(si)大(da)组(jing)件(gang)之一.但是说起IntentService有童靴或许有点陌生,看名字感觉和Service有关连.不错,不仅有关联而且关系还不一般,IntentService是Service的子类,所以它也是正宗的Service,由于IntentService借助了HandlerThread,我

android源码解析之(三)-->HandlerThread

HandlerThread是个什么东西?查看类的定义时有这样一段话: Handy class for starting a new thread that has a looper. The looper can then be used to create handler classes. Note that start() must still be called. 意思就是说:这个类的作用是创建一个包含looper的线程. 那么我们在什么时候需要用到它呢?加入在应用程序当中为了实现同时完成