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

  在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

时间: 2024-09-08 21:53:34

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

Android中关于Handler的若干思考

本文包括与Handler有关的以下问题: (1)Handler的作用 (2)为什么Android中要设计为只能在UI线程中去更新UI呢? (3)Handler的两个异常 (4)Handler.Looper MessageQueue之间的关系(源码角度) (5)跟线程相关的Handler,即HandlerThread(源码角度分析) (6)主线程往子线程发消息   一.Handler的作用: (1)在非UI线程中完成耗时操作,在UI线程中去更新UI. (2)可以在主线程中发送延时消息.   二.为

Android编程中Handler原理及用法实例分析_Android

本文实例讲述了Android编程中Handler用法.分享给大家供大家参考,具体如下: 在Android的UI开发中,我们经常会使用Handler来控制主UI程序的界面变化.有关Handler的作用,我们总结为:与其他线程协同工作,接收其他线程的消息并通过接收到的消息更新主UI线程的内容. 我们假设在一个UI界面上面,有一个按钮,当点击这个按钮的时候,会进行网络连接,并把网络上的一个字符串拿下来显示到界面上的一个 TextView上面,这时就出现了一个问题,如果这个网络连接的延迟过大,可能是10

Android开发之Handler使用4个例子

Handler使用例1这个例子是最简单的介绍handler使用的,是将handler绑定到它所建立的线程中. 本次实验完成的功能是:单击Start按钮,程序会开始启动线程,并且线程程序完成后延时1s会继续启动该线程,每次线程的run函数中完成对界面输出nUpdateThread...文字,不停的运行下去,当单击End按钮时,该线程就会停止,如果继续单击Start,则文字又开始输出了. 软件界面如下: 实验主要部分代码和注释: MainActivity.java: 复制代码代码如下: packag

AsyncTask陷阱之:Handler,Looper与MessageQueue的详解_Android

AsyncTask的隐蔽陷阱先来看一个实例这个例子很简单,展示了AsyncTask的一种极端用法,挺怪的. 复制代码 代码如下: public class AsyncTaskTrapActivity extends Activity {    private SimpleAsyncTask asynctask;    private Looper myLooper;    private TextView status;     @Override    public void onCreate

Thread、Handler和HandlerThread关系详解_Android

前言 前几天看到一道面试题:Thread.Handler和HandlerThread有什么区别?,这个题目有点意思,对于很多人来说,可能对Thread和Handler很熟悉,主要涉及到Android的消息机制(Handler.Message.Looper.MessageQueue),详见< 从Handler.post(Runnable r)再一次梳理Android的消息机制(以及handler的内存泄露)> 但是这个HandlerThread是拿来做什么的呢?它是Handler还是Thread

Thread、Handler和HandlerThread关系详解

前言 前几天看到一道面试题:Thread.Handler和HandlerThread有什么区别?,这个题目有点意思,对于很多人来说,可能对Thread和Handler很熟悉,主要涉及到Android的消息机制(Handler.Message.Looper.MessageQueue),详见< 从Handler.post(Runnable r)再一次梳理Android的消息机制(以及handler的内存泄露)> 但是这个HandlerThread是拿来做什么的呢?它是Handler还是Thread

AsyncTask陷阱之:Handler,Looper与MessageQueue的详解

AsyncTask的隐蔽陷阱 先来看一个实例 这个例子很简单,展示了AsyncTask的一种极端用法,挺怪的. 复制代码 代码如下: public class AsyncTaskTrapActivity extends Activity {     private SimpleAsyncTask asynctask;     private Looper myLooper;     private TextView status; @Override     public void onCrea

rtsp-跪求大神指教Android下播放RTSP实时流问题!

问题描述 跪求大神指教Android下播放RTSP实时流问题! 小弟在做一个Android客户端,用于监控电脑端摄像头传过来的流,就是能在Android客户端看到电脑摄像头看到的东西.现在遇到了问题不会解决.1.先用了DarWin来充当流服务器,然后它里面有配置一个端口和地址,然后调用rtsp://218.192.127.43:554/live.sdp电脑上安装一个VLC.然后就可以看到摄像头传来的画面了.2.我想在Android端也实现这样的功能.我用SurfaceView,Mediaplay

深入探讨Android异步精髓Handler

探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 详解Android主流框架不可或缺的基石 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Android多分辨率适配框架(3)- 使用指南 自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View