Android 中 Handler 消息传递机制
来源:互联网 发布:北大青鸟软件编程 编辑:程序博客网 时间:2024/04/28 02:54
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
在 Android 平台中,新启动的线程是无法访问 Activity 里的 Widget 的,当然也不能将运行的状态送出来,这就需要有 Handler 机制进行消息的传递了,
Handler 的主要功能是完成 Activity 的 Widget 与应用程序中线程之间的交互。
开发事实有 Handler 类的程序步骤如下:
1,在 Activity 或 Activity 的 Widget 中创建 Handler 类的对象,并重写 handleMessage 方法。
2,在新启动的线程中调用 sendEmptyMessage 或者 sendMessage 方法向 Handler 发送消息。
3,Handler 类的对象用 handleMessage 方法接收消息,然后根据消息的不同执行不同的操作。
下面举一个换图程序的例子。
主要逻辑代码
- package wyf.ytl;
- import android.app.Activity;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
- import android.widget.ImageView;
- public class SampleHandler extends Activity {
- ImageView myImageView;
- Handler myHandler = new Handler(){
- @Override
- public void handleMessage(Message msg) {
- switch(msg.what){
- case 0:
- myImageView.setImageResource(R.drawable.bbta);break;
- case 1:
- myImageView.setImageResource(R.drawable.bbtb);break;
- case 2:
- myImageView.setImageResource(R.drawable.bbtc);break;
- case 3:
- myImageView.setImageResource(R.drawable.bbtd);break;
- }
- super.handleMessage(msg);
- }
- };
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- myImageView = (ImageView) findViewById(R.id.myImageView);
- MyThread myThread = new MyThread(this);
- myThread.start();
- }
- }
换图线程类
- package wyf.ytl;
- public class MyThread extends Thread{
- SampleHandler activity;
- int what = 1;
- public MyThread(SampleHandler activity){
- this.activity = activity;
- }
- @Override
- public void run() {
- while(true){
- activity.myHandler.sendEmptyMessage((what++)%4);
- try{
- Thread.sleep(2000);
- }
- catch(Exception e){
- e.printStackTrace();
- }
- }
- }
- }
- <?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"
- android:gravity="center" >
- <ImageView
- android:id="@+id/myImageView"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:src="@drawable/bbta"
- android:gravity="center" />
- </LinearLayout>
运行程序观察运行效果,会每隔两秒钟更换一张图片。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
(1)在同一个Activity中 再定义一个private final Handler mHandler = new Handler();
(2)在同一个Activity中 先定义一个Runnable
Runnable mUpdateTimer = new Runnable() {
public void run() {
updateTimerView();
}
};
(3)在同一个Activity中 再定义一个updateTimerView()
private void updateTimerView() {
long timer = 0;
switch (mState) {
case RECORDER_STARTED:
if (lastState == RECORDER_PAUSED)
mHandler.postDelayed(mUpdateTimer, 1000 * looperTimes
- currentTime);
else
mHandler.postDelayed(mUpdateTimer, 1000 * (++looperTimes)- currentTime);
timer = (currentTime + 500) / 1000;
break;
case RECORDER_IDLE:
break;
case RECORDER_CREATED:
timer = 0;
break;
}
(4) Handler 类说明
public final boolean postDelayed(Runnable r, long delayMillis)
Causes the Runnable r to be added to the message queue, to be run after the specified amount of time elapses. The runnable will be run on the thread to which this handler is attached.
Parameters
Returns
- Returns true if the Runnable was successfully placed in to the message queue. Returns false on failure, usually because the looper processing the message queue is exiting. Note that a result of true does not mean the Runnable will be processed -- if the looper is quit before the delivery time of the message occurs then the message will be dropped.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
(1) class myHandler extends Handler {
@Override
public void handleMessage(Message msg) {
int type = msg.what;
switch (type) {
case MSG_DRAG_BACK:
break;
case SAVE:
break;
case PAUSE_TIMER:
break;
case ENABLE_CLICKBUTTON:
break;
}
}
}
(2)private myHandler syhHandler;
(3)public void useMyHandler(){
if (syhHandler == null) {
syhHandler = new myHandler();
}
Message msg = syhHandler.obtainMessage(ENABLE_CLICKBUTTON);
syhHandler.removeMessages(ENABLE_CLICKBUTTON);
syhHandler.sendMessageDelayed(msg, 1000);
}
(1)public AudioService(Context context) {
......
createAudioSystemThread();
......
}
(2)private void createAudioSystemThread() {
mAudioSystemThread = new AudioSystemThread();
mAudioSystemThread.start();
waitForAudioHandlerCreation();
}
/** Waits for the volume handler to be created by the other thread. */
(3)private void waitForAudioHandlerCreation() {
synchronized(this) {
while (mAudioHandler == null) {
try {
// Wait for mAudioHandler to be set by the other thread
wait();
} catch (InterruptedException e) {
Log.e(TAG, "Interrupted while waiting on volume handler.");
}
}
}
}
(4)/** Thread that handles native AudioSystem control. */
private class AudioSystemThread extends Thread {
AudioSystemThread() {
super("AudioService");
}
@Override
public void run() {
// Set this thread up so the handler will work on it
Looper.prepare();
synchronized(AudioService.this) {
mAudioHandler = new AudioHandler();
// Notify that the handler has been created
AudioService.this.notify();
}
// Listen for volume change requests that are set by VolumePanel
Looper.loop();
}
(5) /** Handles internal volume messages in separate volume thread. */
private class myHandler extends Handler {
private void userDefinedfuntionTest1() {
........
// Post a persist msg
sendMsg();
}
private void userDefinedfuntionTest2() {
.......
// Post a persist msg
sendMsg();
}
private void userDefinedfuntionTest1() {
........
}
private void userDefinedfuntionTest2() {
.......
}
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_ONE:
break;
case MSG_TWO:
break;
case MSG_THREE:
break;
case MSG_FOURCE:
break;
case MSG_SIX:
break;
}
}
}
(6)private static void sendMsg(Handler handler, int msg, int existingMsgPolicy, int arg1, int arg2, Object obj, int delay) {
if (existingMsgPolicy == SENDMSG_REPLACE) {
handler.removeMessages(msg);
} else if (existingMsgPolicy == SENDMSG_NOOP && handler.hasMessages(msg)) {
Log.d(TAG, "sendMsg: Msg " + msg + " existed!");
return;
}
handler.sendMessageDelayed(handler.obtainMessage(msg, arg1, arg2, obj), delay);
}
(7)Handler的sendMessageDelayed (Message msg, long delayMillis) 说明:
public final boolean sendMessageDelayed (Message msg, long delayMillis)
Added in API level 1
Enqueue a message into the message queue after all pending messages before (current time + delayMillis).
You will receive it in handleMessage(Message), in the thread attached to this handler.
Returns
Returns true if the message was successfully placed in to the message queue.
Returns false on failure, usually because the looper processing the message queue is exiting.
Note that a result of true does not mean the message will be processed --
if the looper is quit before the delivery time of the message occurs then the message will be dropped.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- Android 中 Handler 消息传递机制
- Android 中 Handler 消息传递机制
- Android中Handler消息传递机制
- Android 中 Handler 消息传递机制
- Android中Handler传递消息机制详解
- Android Handler消息传递机制
- Android Handler消息传递机制
- android Handler 消息传递机制
- Android Handler消息传递机制
- android Handler 消息传递机制
- Android:Handler消息传递机制
- Android Handler消息传递机制
- android消息传递机制---handler
- Android消息传递机制----Handler
- Android Handler消息传递机制
- android--------Handler 消息传递机制
- Android消息传递之Handler消息机制
- Android消息传递之Handler消息机制
- 微软本身的软件迭代旧习
- 彻底搞定C指针---指向指针的指针
- Delphi 7的Indy网络组件学习笔记01
- UE中的一些实用技巧
- windows 8 “大号带小号”的开路策略
- Android 中 Handler 消息传递机制
- [FreeBSD]Apache + MySQL + PHP + mod_fastcgi
- Mac下git和github使用
- Blur detection
- Windows 8 会成为一款成功的操作系统吗?
- Zend Framework 1.12.0命令行工具使用
- 怎么祭奠,不堪一击的爱情:伤感日志
- ARM嵌入式编程(无操作系统、基于MDK)之最简单的程序:点亮一个LED灯
- 输出乘法口诀表