android的简单消息机制

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() {
			
			@Override
			public 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 block
								e.printStackTrace();
							}
							//当图片切换到最后一个又从第一个开始切换
							if(index >= 4){
								index = -1;
							}
							index++;
						}
		        	};
		        }.start();
			}
		});
        //停止切换
        btn2.setOnClickListener(new OnClickListener() {
			
			@Override
			public 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接收消息
	 */
	@Override
	public 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消息处理机制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值