Android通信组件_消息机制_消息传送

来源:互联网 发布:财商教育是骗局吗 知乎 编辑:程序博客网 时间:2024/06/02 05:44

Message , Looper , Handler类的关系

#在Android操作系统之中本身是存在这消息队列的操作,用消息队列可以完成主线程和子线程之间的消息传递,要想完成这些线程的消息操作,则需要使用Message , Looper ,Handler这几个类。

#  looper本身就是一个消息队列的集合,而每个消息都可以通过Handler增加和取出,而操作Handler的对象是主线程(UI Thread)和子线程。

       主线程一般在Android中成为UI线程,一个界面显示,那么这个就属于主线程,而子线程指的是那么利用Rnnable实现的线程操作类。


public class MyMessageDemo extends Activity {
private TextView info = null ;
private static int count = 0 ;// 表示更新后的记录
private static final int SET = 1 ;// 操作的what状态

private Handler myHandler = new Handler() {


@Override
public void handleMessage(Message msg) {
switch(msg.what) {// 判断操作的消息类型
case SET: // 更新组件
MyMessageDemo.this.info.setText("count - " + count ++) ;
}
}
};

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.info = (TextView) super.findViewById(R.id.info) ;// 取得组件
Timer timer = new Timer() ;
timer.schedule(new MyTask(), 0,1000) ;

}
private class MyTask extends TimerTask{


@Override
public void run() {
Message msg = new Message() ;// 设置更新
msg.what = SET ;// 操作的标记
MyMessageDemo.this.myHandler.sendMessage(msg) ;// 发送消息
}

}
}

消息通道:Looper

         在使用Handler处理Message的时候,实际上都是依靠一个Looper通道完成的。当用户取得一个Handler对象的时候实际上都是通过Looper完成的。在一个Activity类中,会自动的帮助用户启动好的Looper对象,而如果是在用户自定义的类之中,则需要用户使用调用Looper类中的若干方法之后才可以正常的启动Looper对象。

public class MyMessageDemo extends Activity {
private TextView info = null;
private static final int SET = 1; // 操作的what状态
private Button but = null; // 操作按钮


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.info = (TextView) super.findViewById(R.id.info); // 取得组件
this.but = (Button) super.findViewById(R.id.but); // 取得组件
this.but.setOnClickListener(new OnClickListenerImpl()); // 单击事件
}


private class OnClickListenerImpl implements OnClickListener {
@Override
public void onClick(View v) {
Looper looper = Looper.myLooper();
MyHandler myHandler = new MyHandler(looper);
myHandler.removeMessages(0); // 表示清空所有的消息
String data = "魔乐科技软件学院(MLDN)"; // 要传递的消息
Message msg = myHandler.obtainMessage(SET, 1, 1, data); // 创建消息
myHandler.sendMessage(msg); // 发送消息
}


}


private class MyHandler extends Handler {
public MyHandler(Looper looper) {
super(looper);
}


@Override
public void handleMessage(Message msg) {
switch (msg.what) { // 判断操作的消息类型
case SET: // 更新组件
MyMessageDemo.this.info.setText(msg.obj.toString()); // 设置文本组件
}
}
}
}

既然已经清楚了三个操作类的关系,常用的就是Handler和Message,那么下面完成一个线程和一个子线程的操作范例,两个线程之间如何进行数据的交互。

<?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/msg"
android:layout_width="fill_parent"
android:layout_height="wrap_content" 
android:text="等带子线程发送消息。" />
<Button 
android:id="@+id/but"
android:layout_width="fill_parent"
android:layout_height="wrap_content" 
android:text="交互" />
</LinearLayout>


文本组件的内容是等待子线程设置回调数据的,而主线程想子线程发出的内容,肯定都属于后台的一些费时操作,所以直接向子线程发送一条文本,输出即可。

public class MyThreadDemo extends Activity {
public static final int SETMAIN = 1; // 设置一个what标记
public static final int SETCHILD = 2; // 设置what的标记]
private Handler mainHandler, childHandler;
private TextView msg = null;
private Button but;


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.msg = (TextView) super.findViewById(R.id.msg);
this.but = (Button) super.findViewById(R.id.but);
this.mainHandler = new Handler(){


@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}

} ;
new Thread(new ChildThread(), "Child Thread").start();
this.but.setOnClickListener(new OnClickListenerImpl()) ;
}


private class OnClickListenerImpl implements OnClickListener {


@Override
public void onClick(View v) {// 是将信息发送到子线程之中
if (MyThreadDemo.this.childHandler != null) {
Message childMsg = MyThreadDemo.this.childHandler
.obtainMessage(); // 创建消息
childMsg.obj = MyThreadDemo.this.mainHandler.getLooper()
.getThread().getName()
+ " --> Hello MLDN .";
childMsg.what = SETCHILD ;
MyThreadDemo.this.childHandler.sendMessage(childMsg) ;
}
}


}

class ChildThread implements Runnable {


@Override
public void run() {// 子线程
Looper.prepare() ;// 
MyThreadDemo.this.childHandler = new Handler(){


@Override
public void handleMessage(Message msg) {
switch(msg.what) {
case SETCHILD: // 子线程接收主线程发送来的消息
System.out.println("*** Main Child Message : " + msg.obj) ;
}
}

} ;
Looper.loop() ;// 创建消息队列
}

}
}





0 0
原创粉丝点击