android下关于Handler、Looper、HandlerThread之间的联系与区别

简介:   在android下编程如果要用到线程就必然要用到Handler、Looper或者LooperThread,这三者时间的联系与区别是什么呢?通过看SDK、上网看别人写的博客以及自己编程实践,到底是对这三者有了一定的了解,现在将自己的理解写下来,希望对大家可以有点帮助。   Handler:每个Handler实例都与创建该Handler的线程以及线程的消息队列想关联,而Handler的主

  在android下编程如果要用到线程就必然要用到Handler、Looper或者LooperThread,这三者时间的联系与区别是什么呢?通过看SDK、上网看别人写的博客以及自己编程实践,到底是对这三者有了一定的了解,现在将自己的理解写下来,希望对大家可以有点帮助。

  Handler:每个Handler实例都与创建该Handler的线程以及线程的消息队列想关联,而Handler的主要作用就是对消息队列进行管理,主要体现在处理或者发送message以及Runnable对象。

 Looper:Looper用于维护一个一个线程的消息循环和消息队列,在我看来Looper做的事一些相对较底层的维护工作(本人是一个菜鸟,没有看到这么底层)。一个线程只要有了Looper来管理,就可以接收消息并处理。所以是Looper是用来维护消息队列的,Handler是处理消息队列的消息的。在主线程中,我们可以直接用Hanler来处理消息,这是因为主线程已经有了Looper来维护消息队列了。如果是子线程,就需要自己创建Looper了。


接下来看看SDK上的示例

  class LooperThread extends Thread {
      public Handler mHandler;

      public void run() {
          Looper.prepare();

          mHandler = new Handler() {
              public void handleMessage(Message msg) {
                  // process incoming messages here
              }
          };

          Looper.loop();
      }
  }

  好了,说了这么多,还是上上代码吧:

  package org.asia;


import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;


public class ThreadTestActivity extends Activity {
private TextView text;
private Button button;
private LooperThread loop;
private Handler hand;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        text=(TextView)findViewById(R.id.text);
        button=(Button)findViewById(R.id.button);
        loop=new LooperThread();
        loop.start();
        hand=loop.getHandler();
        button.setOnClickListener(new OnClickListener()
        {


public void onClick(View v) {
// TODO Auto-generated method stub
hand.sendMessage(null);
}
       
        });
    }
    
    
    
    class LooperThread extends Thread
    {
        private Handler handler;
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
Looper.prepare();//创建Looper
handler=new Handler()//创建子线程的handler并且重写handleMessage函数
{


@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
System.out.println(Thread.currentThread().getName());
}

};
Looper.loop();//是Looper开始运行起来
}
Handler getHandler()
{
return handler;
}
   
    }
}

HandlerThread:通过以上的代码可以看见,我们需要自己去管理Looper的创建和运行。那么可不可以有一个类把handler和looper都给我们封装好了呢?答案是有,这个类就是HandlerThread类。关于这个类就不需要多说了,大家随便看个代码示例就可以了解了。这里给大家一个链接看看:点击打开链接
LLooperLooperLooperLooperooper

相关文章
|
22天前
|
消息中间件 存储 Java
Android消息处理机制(Handler+Looper+Message+MessageQueue)
Android消息处理机制(Handler+Looper+Message+MessageQueue)
35 2
|
3月前
Android.mk(makefile)中几个符号的区别:=、 :=、 ?=、 +=
本文解释了在Android.mk文件中使用的几种赋值符号的区别,包括`=`(基本赋值)、`:=`(覆盖赋值)、`?=`(条件赋值,仅在变量未赋值时操作)、`+=`(追加赋值),并通过实验演示了这些符号的具体行为和效果。
150 1
|
2月前
|
Android开发 Kotlin
Android经典面试题之Kotlin的==和===有什么区别?
本文介绍了 Kotlin 中 `==` 和 `===` 操作符的区别:`==` 用于比较值是否相等,而 `===` 用于检查对象身份。对于基本类型,两者行为相似;对于对象引用,`==` 比较值相等性,`===` 检查引用是否指向同一实例。此外,还列举了其他常用比较操作符及其应用场景。
182 93
|
6天前
|
消息中间件 存储 Java
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
|
9天前
|
消息中间件 存储 Java
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
30 1
|
13天前
|
消息中间件 存储 Java
Android消息处理机制(Handler+Looper+Message+MessageQueue)
Android消息处理机制(Handler+Looper+Message+MessageQueue)
42 2
|
消息中间件 存储 机器学习/深度学习
【Android】Handler 机制 ( Handler | Message | Looper | MessageQueue )(二)
【Android】Handler 机制 ( Handler | Message | Looper | MessageQueue )(二)
139 0
|
消息中间件 存储 调度
【Android】Handler 机制 ( Handler | Message | Looper | MessageQueue )(一)
【Android】Handler 机制 ( Handler | Message | Looper | MessageQueue )(一)
175 0