android handler HandlerThread 用法

一、Handler

Handler在android里负责发送和处理消息。它的主要用途有:

  1)按计划发送消息或执行某个Runnanble(使用POST方法);

  2)从其他线程中发送来的消息放入消息队列中,避免线程冲突(常见于更新UI线程)

   默认情况下,Handler接受的是当前线程下的消息循环实例(使用Handler(Looper looper)、Handler(Looper  looper, Handler.Callback callback) 可以指定线程),同时一个消息队列可以被当前线程中的多个对象进行分发、处理(在UI线程中,系统已经有一个Activity来处理了,你可以再起若干个 Handler来处理)。在实例化Handler的时候,Looper可以是任意线程的,只要有Handler的指针,任何线程也都可以 sendMessage。Handler对于Message的处理不是并发的。一个Looper
只有处理完一条Message才会读取下一条,所以消息的处理是阻塞形式的(handleMessage()方法里不应该有耗时操作,可以将耗时操作放在其他线程执行,操作完后发送Message(通过sendMessges方法),然后由handleMessage()更新UI)。

HandlerThread继承于Thread,所以它本质就是个Thread。与普通Thread的差别就在于,它有个Looper成员变量。这个Looper其实就是对消息队列以及队列处理逻辑的封装,简单说就是 消息队列+消息循环。

当我们需要一个工作者线程,而不是把它当作一次性消耗品,用过即废弃的话,就可以使用它。

package com.android.settings;

import android.os.Bundle;

import android.app.Activity;

import android.os.Handler;

import android.os.Message;

import android.text.format.Time;

import android.util.Log;

import android.view.Menu;

import android.view.View;

import android.widget.Button;

import android.widget.TextView;

public class BeidouDetailSettingsActivity extends Activity {

private MyHandlerThread myHandlerThread = null;

private Button mTestBtn;

private TextView mTestTV;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mTestBtn = (Button) findViewById(R.id.main_test_btn);

mTestTV = (TextView) findViewById(R.id.main_test_tv);

mTestBtn.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

Message msg = new Message();

msg.what = 1;

myHandlerThread.sendMessage(msg);

// mHandler.sendMessage(msg);

}

});

myHandlerThread = new MyHandlerThread("background thread.");

myHandlerThread.setmMainHandler(mHandler);

}

final Handler mHandler = new Handler() {

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

if (msg.what == 2) {

Bundle bundle = msg.getData();

String threadID = bundle.getString("id");

String threadName = bundle.getString("name");

Time time = new Time();

time.setToNow();

Log.d("tianxuhong", ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");

String timeStr = time.format3339(true);

StringBuilder sb = new StringBuilder("id:").append(threadID)

.append("\nname:").append(threadName).append("\n")

.append("time:").append(timeStr);

mTestTV.setText(sb.toString());

}

}

};

}

package com.android.settings;

import android.os.Bundle;

import android.os.Handler;

import android.os.HandlerThread;

import android.os.Looper;

import android.os.Message;

import android.util.Log;

/**

* Created by dev on 11/25/13.

*/

public class MyHandlerThread {

private HandlerThread mHandlerThread = null;

private MyHandler mHandler = null;

private Handler mMainHandler = null;

public MyHandlerThread(String threadName) {

super();

mHandlerThread = new HandlerThread(threadName);

mHandlerThread.start();

mHandler = new MyHandler(mHandlerThread.getLooper());

}

public void setmMainHandler(Handler handler) {

this.mMainHandler = handler;

}

public void sendMessage(Message msg) {

mHandler.sendMessage(msg);

}

class MyHandler extends Handler {

MyHandler() {

}

MyHandler(Looper looper) {

super(looper);

}

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

Message toMainMsg = mMainHandler.obtainMessage();

Log.d("tianxuhong","toMainMsg="+toMainMsg);

toMainMsg.what = 2;

Bundle bundle = new Bundle();

String threadID = String.valueOf(Thread.currentThread().getId());

String threadName = Thread.currentThread().getName();

bundle.putString("id", threadID);

bundle.putString("name", threadName);

toMainMsg.setData(bundle);

mMainHandler.sendMessage(toMainMsg);

}

}

}

时间: 2024-10-09 17:35:29

android handler HandlerThread 用法的相关文章

Android handler学习笔记

调用Message.obtain()从消息池中获得一个message对象,而不是直接new一个message对象,可以节省内存开销.也可以用handler.obtainMessage(),其实是一样的,obtainMessage()就是返回Message.obtain() message.sendToTarget()跟handler.sendMessage()是一样的 下面的方式可以拦截Message. private Handler handler=new Handler(new Callba

Android Handler的使用

大家好我们这一节讲的是Android Handler的使用,在讲Handler之前,我们先提个小问题,就是如何让程序5秒钟更新一下Title. 首先我们看一下习惯了Java编程的人,在不知道Handler的用法之前是怎么样写的程序,代码如下所示: package com.android.tutor; import java.util.Timer; import java.util.TimerTask; import android.app.Activity; import android.os.

转载:android Handler详细使用方法实例

本文主要介绍Android中Handler的简单使用方法,Handler跟多线程,消息队列联系很紧密,在平常的实际程序开发中比较常见.本文分为4个简单的例子来学校handler 开发环境为android4.1. Handler使用例1这个例子是最简单的介绍handler使用的,是将handler绑定到它所建立的线程中.本次实验完成的功能是:单击Start按钮,程序会开始启动线程,并且线程程序完成后延时1s会继续启动该线程,每次线程的run函数中完成对界面输出nUpdateThread...文字,

Android Handler消息机制深入浅出

作为Android开发人员,Handler这个类应该是再熟悉不过了,因为几乎任何App的开发,都会使用到Handler这个类,有些同学可能就要说了,我完全可以使用AsyncTask代替它,这个确实是可以的,但是其实AsyncTask也是通过Handler实现的,具体的大家可以去看看源码就行了,Handler的主要功能就是实现子线程和主线程的通信,例如在子线程中执行一些耗时操作,操作完成之后通知主线程跟新UI(因为Android是不允许在子线程中跟新UI的). 下面就使用一个简单的例子开始这篇文章

详解Android Handler的使用

我们进行Android开发时,Handler可以说是使用非常频繁的一个概念,它的用处不言而喻.本文就详细介绍Handler的基本概念和用法. Handler的基本概念         Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分逐个的在消息队列中将消息取出,然后对消息进行出来,就是发送消息和接收消息不是同步的处理. 这种机制通常用来处理相对耗时比较长的操作. Handler工具类在多线程中有两方面的应用: 1.发送消息,在

详解Android Handler的使用-别说你不懂handler(转)

我们进行Android开发时,Handler可以说是使用非常频繁的一个概念,它的用处不言而喻.本文就详细介绍Handler的基本概念和用法. Handler的基本概念         Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分逐个的在消息队列中将消息取出,然后对消息进行出来,就是发送消息和接收消息不是同步的处理. 这种机制通常用来处理相对耗时比较长的操作. Handler工具类在多线程中有两方面的应用: 1.发送消息,在

详解Android Handler的使用-别说你不懂handler

我们进行Android开发时,Handler可以说是使用非常频繁的一个概念,它的用处不言而喻.本文就详细介绍Handler的基本概念和用法. Handler的基本概念         Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分逐个的在消息队列中将消息取出,然后对消息进行出来,就是发送消息和接收消息不是同步的处理. 这种机制通常用来处理相对耗时比较长的操作. Handler工具类在多线程中有两方面的应用: 1.发送消息,在

Android培训HandlerThread的使用及源码解析

Android培训HandlerThread的使用及源码解析-北京尚学堂 关于Hanlder的基本使用可以参见博文<Android中Handler的使用>,如果想了解Handler.Looper.Thread等的相互关系以及内部实现原理可以参见博文<深入源码解析Android中的Handler,Message,MessageQueue,Looper>. Android中的API中对HandlerThread的描述是: Handy class for starting a new t

Android Handler使用实例

本文主要介绍Android中Handler的简单使用方法,Handler跟多线程,消息队列联系很紧密,在平常的实际程序开发中比较常见.本文分为4个简单的例子来学校handler Handler使用例1这个例子是最简单的介绍handler使用的,是将handler绑定到它所建立的线程中.本 次实验完成的功能是:单击Start按钮,程序会开始启动线程,并且线程程序完成后延时1s会继续启动该线程,每次线程的run函数中完成对界面输出 nUpdateThread...文字,不停的运行下去,当单击End按