Android的消息机制

Android的消息机制主要是指Handler的运行机制,Handler的运行需要底层的MessageQueue和Looper的支撑。对于有开发过Android经验的童鞋都知道,我们一般都是用Handler来更新UI的,更新UI只是handler用法的一部分,下面一起来研究一下handler的神秘面纱。

那么handler是什么?

handler是android给我们用来更新UI的一套机制,也是一套消息处理机制,我们可以通过handler来发送消息,也可以通过它来处理消息

handler主要有以下4种用法

1、sendMessage

2、sendMessageDelayed

3、post(Runnable)

4、postDelayed(Runnable,long)

上用法:

package com.iotek.handlerdemo;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
TextView textView = (TextView) findViewById(R.id.txt);
switch (msg.what) {
case RESULT_OK:
textView.setText("ok");
break;
default:
break;
}
};
};
private static final int RESULT_OK = 13;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn = (Button) findViewById(R.id.btn_ok);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
new MyThread().start();
}
});


}


class MyThread extends Thread{
@Override
public void run() {
try {
//block operation
Thread.sleep(5 * 1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
handler.sendEmptyMessage(RESULT_OK);
super.run();
}
}



@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

}

 

 

实例二:

 

package com.example.ch16_messagehandler;

import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.text.StaticLayout;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.os.Build;

public class MainActivity extends Activity {

private Handler handler = new Handler() {
public void handleMessage(Message msg) {
// 打印出消息的what值
// Log.i("handler", "handle message + msg.what" + msg.what);
// 每次点击按钮,达到在TextView后面加上一个“+”的目的
// TextView textView = (TextView) findViewById(R.id.textView1);
// String string = (String) textView.getText();
// textView.setText(string + "+");
// 多事件响应
TextView textView = (TextView) findViewById(R.id.textView1);
switch (msg.what) {
case RESULT_OK:
textView.setText("ok");
break;
case RESULT_CANCEL:
if (msg.arg1 == CANCEL_BY_USER) {
textView.setText("cancel" + "by user");
} else {
textView.setText("cancel" + "by system");
}
break;
default:
break;
}
};
};
private static final int RESULT_OK = 13;
private static final int RESULT_CANCEL = 14;
// arg1和arg2的使用
private static final int CANCEL_BY_USER = 15;
private static final int CANCEL_BY_SYSTEM = 16;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Button button = (Button) findViewById(R.id.button_ok);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 发送普通消息,需要自己填充消息
// Message msg = Message.obtain();
handler.obtainMessage();
// msg.what = RESULT_OK;
// handler.sendMessage(msg);
// 发送空消息,不需要自己填充消息(因为消息为空)
// handler.sendEmptyMessage(RESULT_OK);
// 发送延迟消息,同样不需要自己填充消息
// handler.sendEmptyMessageDelayed(RESULT_OK, 5 * 1000);
// 调用子线程,在子线程中进行阻塞操作;然后发送消息给消息队列
new MyThread().start();
}
});

button = (Button) findViewById(R.id.button_cancel);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// Message msg = Message.obtain();
// msg.what = RESULT_CANCEL;
// msg.arg1 = CANCEL_BY_USER;
// handler.sendMessage(msg);
// 取消消息的延迟
handler.removeMessages(RESULT_OK);
}
});
}


/*
* 子线程,解决阻塞操作的问题
*/
public class MyThread extends Thread {
@Override
public void run() {
try {
Thread.sleep(5 * 1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
handler.sendEmptyMessage(RESULT_OK);
super.run();
}
}

}

posted @ 2016-09-21 14:43  飘忽洛神  阅读(128)  评论(0)    收藏  举报