放假上来,整个人都懒了。日志也是丢了好多天,潜台词就是:我有好多天没有搞学习, 这不,今天连对话框都写不出来了,真是自惭形秽。
好不容易到开学了,这几天好好跟着老师搞,前面的东西只有点映像了,唉,真担心啊。
今天将的是android的消息机制:用于线程间的通信主要有looper,messagequeue,message,handler四部分组成
looper: 消息循环主线程中会自带一个looper,非主线程需要自己创建,创建looper的时候会自行创建一个messagequeue,内部的元素自然是message,最后是handler,他负责处理messagequeue中的第一个message。
handler有两种功能,发送消息和处理消息,用哪条线程处理消息就用谁的handler来发送消息。
今天写的是一个很小的消息传递和处理,其实本可以用一条线程就可以搞定,但是要在比较大的项目中多线程的优势才能得到体现,联系嘛,就不管那么多了。
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MessageHomeActivity extends Activity implements OnClickListener {
private static final int MESSAGE_UPDATA = 0;
private static final int MESSAGE_STOP = 1;
/** Called when the activity is first created. */
/**
* 主线程的handler
*/
private Handler handler = new Handler(){
//不是必须的,只有处理消息的时候才需要重写
@Override
public void handleMessage(Message msg) {
//根据消息类别处理
switch (msg.what) {
case MESSAGE_UPDATA:
handlerUpdate(msg);
break;
case MESSAGE_STOP:
handler.removeMessages(MESSAGE_UPDATA);
break;
default:
break;
}
}
/**
* 处理Update 消息
* @param msg
* 接收到的消息
*/
private void handlerUpdate(Message msg) {
//更新UI
textview.setText(String.valueOf(msg.arg1));
//再发送一条
Message message = handler.obtainMessage(MESSAGE_UPDATA, msg.arg1+1, msg.arg2);
handler.sendMessage(message);
}
};
private TextView textview;
private Button buttonstart;
private Button buttonstop;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initView();
}
private void initView() {
textview = (TextView)findViewById(R.id.textView1);
buttonstart = (Button)findViewById(R.id.buttonstart);
buttonstop = (Button)findViewById(R.id.buttonstop);
buttonstart.setOnClickListener(this);
buttonstop.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.buttonstart:
doStart();
break;
case R.id.buttonstop:
doStop();
break;
default:
break;
}
}
/**
* 停止更新:删除消息队列中what为update的消息
*/
private void doStop() {
//handler.removeMessages(MESSAGE_UPDATA);
handler.sendEmptyMessage(MESSAGE_STOP);
}
private void doStart(){
//创建一个消息
//消息的目标:如何处理消息
//消息类型:常量
//参数:初始值
//参数:更新频率
Message message = Message.obtain(handler, MESSAGE_UPDATA, 1, 1000);
//发送消息
handler.sendMessage(message);
}
}