android的简单消息机制

来源:互联网 发布:万网域名备案注销 编辑:程序博客网 时间:2024/06/18 15:23

android中子线程中是不能操作任何组件的,只有通过消息机制,通知主线程执行相应操作

直接看代码吧:

HandleImageChangeTestActivity类:

package com.zzq.activity;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;/** * @author Administrator * */public class HandleImageChangeTestActivity extends Activity {/**消息标识*/public static final int CAHNGE_IMAGE = 5;/**消息对象*/private Handler handler;/**记录当前图片位置*/private int index = 0;/**图片是否继续切换*/private boolean isChange;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                handler = new ChangeImageHandle(this);        Button btn1 = (Button) findViewById(R.id.change_image_main_btn1);        Button btn2 = (Button) findViewById(R.id.change_image_main_btn2);        //点击开始切换        btn1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//开始切换isChange = true;//创建一个线程        new Thread(){        public void run() {        while(isChange) {        //c创建一个消息对象Message message = new Message();//Bundle类似于Map集合存放键值对Bundle bundle = new Bundle();//将当前显示的图片索引放入键值对bundle.putInt("index", index);//定义一个消息的标识message.what = CAHNGE_IMAGE;//将bundle对象放入消息中message.setData(bundle);//发送消息handler.sendMessage(message);try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}//当图片切换到最后一个又从第一个开始切换if(index >= 4){index = -1;}index++;}        };        }.start();}});        //停止切换        btn2.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//停止切换isChange = false;}});    }}

ChangeImageHandle类:

package com.zzq.activity;import android.app.Activity;import android.os.Handler;import android.os.Message;import android.widget.ImageView;/** * 接受处理消息,实现图片切换 * @author Administrator * */public class ChangeImageHandle extends Handler {/**主线程的activity对象*/private Activity activity;/**要切换的图片素组*/private int[] imageArr = new int[]{R.drawable.whatsnew_fornew_01,R.drawable.whatsnew_fornew_02,R.drawable.whatsnew_fornew_03,R.drawable.whatsnew_fornew_04,R.drawable.whatsnew_fornew_05};/**构造方法*/public ChangeImageHandle(Activity activity){this.activity = activity;}/** * 重写父类的handleMessage接收消息 */@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);//得到切换图片的组件ImageView imageView = (ImageView) activity.findViewById(R.id.change_image_main_image1);//根据index键找到当前要显示的图片索引,getData()是获取主线程中设置的数据imageView.setImageResource(imageArr[msg.getData().getInt("index")]);}}

布局文件:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent" >    <Button        android:id="@+id/change_image_main_btn1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="切换"         />        <ImageView        android:layout_below="@id/change_image_main_btn1"        android:id="@+id/change_image_main_image1"        android:layout_width="match_parent"        android:layout_height="match_parent" />    <Button        android:id="@+id/change_image_main_btn2"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentLeft="true"        android:layout_alignParentTop="true"        android:layout_marginLeft="50dp"        android:text="停止" /></RelativeLayout>


关于消息机制的详细内容,参见我转的《Android消息处理机制

原创粉丝点击