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