消息机制

来源:互联网 发布:减肥淘宝排行榜 编辑:程序博客网 时间:2024/06/06 01:00

消息机制

main.xml代码

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="${relativePackage}.${activityClass}" ><!--定义文本组件用于显示信息,定义按钮用于进行事件处理 -->    <TextView        android:id="@+id/text"        android:layout_width="wrap_content"        android:layout_height="wrap_content" />    <Button        android:id="@+id/but"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_toRightOf="@+id/text"        android:text="消息传递" /></RelativeLayout>
MainActivity.java文件内容。

package com.example.infocontact2;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Looper;import android.os.Message;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;public class MainActivity extends Activity {// 定义常量用于标示public static final int SETMAIN = 1;public static final int SETCHILD = 2;private TextView text;private Button but;// 定义两个Handler,用于主线程和子线程之间的通信private Handler mainHandler, childHandler;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);text = (TextView) findViewById(R.id.text);but = (Button) findViewById(R.id.but);Thread t = new Thread(new ChildThread(), "child thread");// 启动线程t.start();but.setOnClickListener(new OnClickListenerImpl());mainHandler = new Handler() {@Override// 当有消息要传到主线程时,定义了主线程处理信息的方法public void handleMessage(Message msg) {switch (msg.what) {case SETMAIN:MainActivity.this.text.setText("主线程接收数据"+ msg.obj.toString());break;}}};}private class OnClickListenerImpl implements OnClickListener {@Override// 将信息发送到子线程public void onClick(View v) {// 创建信息,这种创建信息的方法比Message msg = new Message()的性能要高Message childMsg = MainActivity.this.childHandler.obtainMessage();/* * obj代表的是Object类型的对象 */childMsg.obj = MainActivity.this.mainHandler.getLooper().getThread().getName();// 子线程处理信息的标志childMsg.what = SETCHILD;// 立即发送信息同时调用childHandler的handleMessage()方法处理信息childHandler.sendMessage(childMsg);}}class ChildThread implements Runnable {@Overridepublic void run() {// 创建一个通道Looper.prepare();childHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {// 子线程接收主线程的发送来的消息case SETCHILD:System.out.println("主线程的消息来了");//创建与主线程之间交互的信息Message toMain = MainActivity.this.mainHandler.obtainMessage();toMain.obj = "\n\n子线程的信息来了"+ super.getLooper().getThread().getName();//主线程进行处理信息的标志toMain.what = SETMAIN;//立即发送信息同时调用childHandler的handleMessage()方法处理信息MainActivity.this.mainHandler.sendMessage(toMain);break;}}};// 创建消息队列,消息队列中放的是Message,他会不断地从中提取信息进行处理Looper.loop();}}@Overrideprotected void onDestroy() {super.onDestroy();//终止从消息队列中提取信息,如果不写这句话会一直提取信息,并且Looper.loop()之后的代码不会执行MainActivity.this.childHandler.getLooper().quit();}}
注:Looper相当于通道,本身就是一个消息队列的集合里边放的都是Message,每个消息都可以通过Handler增加和取出。一个线程只能有一个Looper,主线程的Looper会在android应用启动时默认创建,其他子线程都必须通过Looper.prepare()自己创建,然后再通过Looper.loop()方法循环不断地从MessageQueue中提取Message进行处理。



0 0
原创粉丝点击