此篇运用另外一种方法去实现,废话不多说,直接贴代码。
实现的大概思想就是:在子线程只发送一个空消息,不采用循环方法。切换图片在主线程,并且在里面自发自收消息。
int[] images = { R.drawable.pic0, R.drawable.pic1, R.drawable.pic2,
R.drawable.pic3, R.drawable.pic4, R.drawable.pic5, R.drawable.pic6,
R.drawable.pic7, R.drawable.pic8, R.drawable.pic9 };
ImageView iv;
int num =0;
/*
* 注意:初始化Handler对象的时候,千万不要再new Handler()后面直接加;
*
* 一定要将handleMessage方法作为该对象重写的方法,放到该对象对应的{}内
* 格式上与直接new 接口对象非常相似
* */
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
if (msg.what == 0) {
iv.setImageResource(images[num % images.length]);
num++;
//等待参数二指定的毫秒值后发送空消息0
/*
* 参数1:发送的空消息的id唯一标识
* 参数2:等待的时间
* */
handler.sendEmptyMessageDelayed(0, 2000);
/*
* 对应handler的方法 不在此多做介绍,基础代码整理完之后,还会再写一篇理论的知识
* */
/*
* 在指定时间点发送空消息
* 1:该消息的唯一标识
* 2:发送消息的准确时间对应的毫秒值
* */
// handler.sendEmptyMessageAtTime(0, System.currentTimeMillis()+1000);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_two);
iv = (ImageView)findViewById(R.id.imageView1);
}
//模拟按钮 进行耗时操作
public void changImage(View v) {
switch (v.getId()) {
case R.id.button1: // 开始启动图片的切换
new Thread(){
@Override
public void run() {
try {
sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
handler.sendEmptyMessage(0);
}
}.start();
break;
case R.id.button2 : //停止切换图片
/*
* 停止发送标识符为0的消息
* 实际上是从消息队列中移除标识符为0的消息
* */
handler.removeMessages(0);
break;
}
}