本文转载(Touch Android 论坛) :Android Handler 异步消息机制
Handler基本概念:
Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分逐个的在消息队列中将消息取出,然后对消息进行出来,就是发送消息和接收消息不是同步的处理。 这种机制通常用来处理相对耗时比较长的操作。
Handler 常用方法:
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable long)
sendEmptyMessage(int)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
以上post类方法允许你排列一个Runnable对象到主线程队列中,
sendMessage类方法, 允许你安排一个带数据的Message对象到队列中,等待更新.
个人认为Android 中Handler 很像 Web开发中的Ajax。拿jquery 的$.ajax()方法来举例:
$.ajax({
url:"xxxx.jsp",
dataType:"text",
success:function(message){ // 处理返回的结果}
})
首先我们按老规矩先看Demo的效果图:
1、点击 测试 按钮的开启一条线程处理其他比较耗时的业务,相当于 一个Web页面点击页面的某个按钮后调用javascript 的ajax方法去后台去数据,而本身的页面是没变的。
2、是否是异步的呢?从图二可以看出。先打印出了线程中 “start Thread”,才执行 onClick 方法中的 “OnClick........”
3、下面代码效果等于ajax请求的后台的响应,那Java来说就是 printWriter.prinlt(1);
Thread thread = new Thread()
{
public void run()
{
Log.i(TAG, "start Thread");
//发送一个空消息到消息队列里面
//此方法相当于后台往前台Ajax响应结果,在Java当中,相当于一个Action方法里面out.println(1);
handler.sendEmptyMessage(1);
};
};
4、 以下代码相当于ajax的 success:function(message){if(message==1){//do something}}
if(msg.what ==1)
{
txtTest.setText("异步处理结果 === Handler ");
}
下面看一下具体代码是怎么实现的:
main.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:id="@+id/txtTest"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="HandlerTest"
/>
<Button android:id="@+id/btnTest"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="测试"
/>
</LinearLayout>
Activity:
package com.droidstouc.handler.test;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
/**
* Android Handler 异步消息处理机制
* @author Administrator
*
*/
public class HandlerTestActivity extends Activity {
private static final String TAG="HandlerTestActivity";
private Button btnTest;
private TextView txtTest;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
txtTest = (TextView) this.findViewById(R.id.txtTest);
btnTest= (Button) this.findViewById(R.id.btnTest);
//设置 OnClick **
btnTest.setOnClickListener(new BtnTestOnClickListener());
}
//点击测试按钮后调用 BtnTestOnClickListener 的 OnClick 方法
class BtnTestOnClickListener implements OnClickListener
{
@Override
public void onClick(View v)
{
/* //把线程对象放到handler的队列中,线程会马上启动执行
handler.post(thread);*/
//启动线程
thread.start();
try
{
// 为了看到异步效果,我让当前线程停止了2秒钟
Thread.sleep(2000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
Log.i(TAG, "OnClick........");
}
}
// 定义一个Handler,用来异步处理数据
Handler handler = new Handler()
{
//相当于jquery $.ajax方法中的 Success:function(){}
public void handleMessage(android.os.Message msg)
{
// 对线程中 handler 返回的结果进行处理
Log.i(TAG, "结果返回,正在处理");
if(msg.what ==1)
{
txtTest.setText("异步处理结果 === Handler ");
}
};
};
Thread thread = new Thread()
{
public void run()
{
Log.i(TAG, "start Thread");
//发送一个空消息到消息队列里面
//此方法相当于后台往前台Ajax响应结果,在Java当中,相当于一个Action方法里面out.println(1);
handler.sendEmptyMessage(1);
};
};
}