Android 消息传递机制
Handler是android中提供的一个消息处理的机制,常用于在子线程中发送消息,在主线程中获取并处理消息。
基本的机制如下图:
Handler
- 处理消息:
Handler h = new Handler(){
@Override
public void handlerMessage(Message msg) {
// 对消息进行处理
super.handlerMessage(msg);
}
}
-
发送消息:
<handler>.sendMessage(Message msg)<handler>.sendEmptyMessage (int what)
what
:消息标识
举例:
package com.mingrisoft;
import android.app.Activity;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ProgressBar;
import android.widget.Toast;
public class MainActivity extends Activity {
final int TIME = 60; //定义时间长度
final int TIMER_MSG = 0x001; //定义消息代码
private ProgressBar timer; //声明水平进度条
private int mProgressStatus = 0; //定义完成进度
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
timer = (ProgressBar) findViewById(R.id.timer); //获取进度条组件
handler.sendEmptyMessage(TIMER_MSG); //发送消息,启动进度条
}
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
//当前进度大于0
if (TIME - mProgressStatus > 0) {
mProgressStatus++; //进度+1
timer.setProgress(TIME - mProgressStatus); //更新进度条的显示进度
handler.sendEmptyMessageDelayed(TIMER_MSG, 1000); //延迟一秒发送消息
} else {
Toast.makeText(MainActivity.this, "时间到!游戏结束!", Toast.LENGTH_SHORT).show(); //提示时间已到
}
}
};
}
Message
用以和Handler
,Looper
合作使用,作为数据的载体。
Message中包含了几个基本属性:int arg1,arg2
,Object obj
,Messenger replyTo
,what
,利用这些属性则可以无需分配新的存储空间从而存储信息。
- 获取Message对象:通过以下两个方法,可以避免分配新的对象,从全局池中获取对象。
Message.obtain()
Handler.obtainMessage()
Looper
用以为线程将消息循环不断的传递给Handler进行处理。
基本步骤:
举例:
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();// 1. 初始化Looper
mHandler = new Handler(Looper.myLooper()) {
public void handleMessage(Message msg) {
// process incoming messages here
}
};// 创建Handler
Looper.loop();// d
}
}