Android制定了一条规则:只允许UI线程修改Activity里的UI组件。主线程通常又被叫做UI线程。
那么这样的话新启动的线程就不可能动态改变界面组件的属性值,但显然这是不可能的。所以便有了Handler消息处理机制。
Handler类:
主要有两个作用:
1.在新启动的线程中发送消息
2.在主线程中获取、处理消息。
主要方法:
void handleMessage (Message msg):处理消息的方法
final boolean hasMessage (int what):检查消息队列中是否含有what属性的值
final boolean hasMessage(int what,Object object):检查消息队列中是否包含有what属性和object属性的值
sendEmptyMessage (int what):发送空消息
final boolean sendMessage (Message msg):立即发送消息
final boolean sendMessageDelayed (Message msg,long delayMillis):指定多少毫秒之后发送消息
自动播放动画:
MainActivity.java:
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageView;
public class MainActivity extends Activity {
int images[] = new int[] { R.drawable.yy01, R.drawable.yy02,
R.drawable.yy03, R.drawable.yy04, R.drawable.yy05, R.drawable.yy06,
R.drawable.yy07, R.drawable.yy08, R.drawable.yy09, R.drawable.yy10,
R.drawable.yy11, R.drawable.yy12, R.drawable.yy13, };
int currentImage = 0;
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.imageshow);
final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
// 如果该消息是本程序发出的
if (msg.what == 0x1233) {
// 修改要显示的图片
imageView.setImageResource(images[currentImage++
% images.length]);
}
}
};
// 定义一个计时器,让该计时器周期性的执行指定任务
// 通过Timer周期性的执行指定任务,Timer对象可调度TimerTask对象,TimerTask对象的本质就是启动一条新线程
new Timer().schedule(new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
// 发送空消息
mHandler.sendEmptyMessage(0x1233);
}
}, 0, 2000);
}
}
布局文件中就只有一个ImageView。。
原文地址:http://blog.csdn.net/u013476556/article/details/45199945