1.试下用postDelayed(Runnable a, int time),因为post把消息放到Looper中就返回,但Looper中没有其他消息又会被立刻取出来执行,这样就有可能做了run中的操作,而没有及时刷新按钮.
2.另外,这种做法耗时操作仍然是由UI线程去做了。。而不是你想的另起了线程。。
建议最好用下面的方法:
定义一个线程。
class MyThread extends Thread{
Handler mHandler;
Boolean boo;
public MyThread(Handler handler){
mHandler = handler;
}
public void setBoo(boolean b) {boo = b; }
publid void run(){
if(boo){
getWeatherInfo();//耗时操作
analyzing();//耗时操作
mHandler.post(new Runnable() {
public void run() {
setWeather();//更新UI
}
);//更新UI
boo = true;
}
}
}
在处理单击事件时:
sureButton.setOnClickListener(new Button.OnClickListener(){
public void onClick(View view){
setBoo(true);
myThread.start();
}
});
在activity中:
MyThread myThread = new MyThread(mHandler);
6.4.2 postDelayed方法和removeCallbacks方法的使用(1)
方法postDelayed的作用是延迟多少毫秒后开始运行,而removeCallbacks方法是删除指定的Runnable对象,使线程对象停止运行。
方法声明如下:
public final boolean postDelayed (Runnable r, long delayMillis)
其中参数Runnable r在Handler对象所运行的线程中执行。
创建名称为handler2的Android项目,Main.java的核心代码如下:
public class Main extends Activity {
private Button button1;
private Button button2;
private Handler handler = new Handler();
private int count = 0;
private Runnable runnableRef = new Runnable() {
public void run() {
Log.v("2", Thread.currentThread().getName());
count++;
Log.v("!", "count=" + count);
handler.postDelayed(runnableRef, 1000);
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.v("1", Thread.currentThread().getName());
button1 = (Button) this.findViewById(R.id.button1);
button2 = (Button) this.findViewById(R.id.button2);
button1.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
Thread thread = new Thread(runnableRef);
thread.start();
Log.v("!!!!!!!!!!!!!", "end");
}
});
button2.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
handler.removeCallbacks(runnableRef);
}
});
}
}
程序运行后单击button1按钮开始循环,count累加1,运行结果如图6.41所示。