1、先举个例子:
图片定时轮播
MainActivity.java:
package com.example.weixin;
import java.util.Timer;
import java.util.TimerTask;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBarActivity;
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 ActionBarActivity {
int[] drawable = new int[]{
R.drawable.a,
R.drawable.b,
R.drawable.c
};
int i = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ImageView imageView = (ImageView)findViewById(R.id.view);
final Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
if(msg.what == 0x110)
{
imageView.setImageResource(drawable[i++%drawable.length]);
}
}
};
new Timer().schedule(new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
handler.sendEmptyMessage(0x110);
}
},0,1200);
}
方法内的匿名内部类调用局部变量时,该局部变量必须是常量。此时内部类会把该常量复制一份放到内部类中,这样,方法结束时,虽然局部变量消失了,但是内部类中的常量还是可以使用的
原因参考:http://www.cnblogs.com/dolphin0520/p/3811445.html图片资源的名字不能是数字,否则出错
- 只有UI线程能处理与UI相关的事件,其他线程不能处理,这样就用到了handler消息处理机制
2、Looper、Handler、MessageQueue的作用:
- Looper:每个线程只有一个Looper,它负责管理MessageQueue,会不断地从MessageQueue中取出消息,并将消息分给对应的Handler处理
- MessageQueue:有Looper负责管理,它采用先进先出的方式来管理Message
- Handler:它能把消息发送给MessageQueue,并负责处理Looper分给它的消息
3、 在线程中使用Handler的步骤如下:
- 调用Looper的prepare()方法为当前线程创建Looper对象,创建对象时,它的构造器会创建与之配套的MessageQueue
- 有了Looper后,创建Handler的实例,重写handleMessage()方法,该方法负责处理来自于其他线程的消息
- 调用Looper的loop()方法,启动Looper