从Java来看我们可以结合Timer,TimerTask,Handler来实现定时刷新,但是,从Android来说建议用Handler,Runnable。(我们把Timer,TimerTask, Handler的方法以下命名为A方法。 Handler,Runnable命名为B方法)。
在这里说下,实现一个功能有多种方法,每种方法都有自己的特点,所以不必纠结别人实现的比自己好,而放弃自己的东西。功能实现必须从无到有,慢慢优化,取人之长补己之短。才能慢慢进步。(呵呵扯淡..)。
在Android UI操作时经常会启动一个Thread来刷新UI,通常会出现以下异常:
01-07 09:25:38.920: E/AndroidRuntime(12696): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
从上层角度来看,该异常的原因是Android的子线程中不允许刷新UI,UI操作必须放在主线程中(main)。这里大家可以参照B方法的实现,
从底层角度来看,其实子线程并非不能刷新UI的,请参照 http://www.oschina.net/question/54100_29585,该blog对子线程刷新UI,做了详细的讲解,这里就不再重复了,有意向了解的童鞋可以参考下。
不过还是建议使用B方法去实现UI刷新的操作。
在这里说下,实现一个功能有多种方法,每种方法都有自己的特点,所以不必纠结别人实现的比自己好,而放弃自己的东西。功能实现必须从无到有,慢慢优化,取人之长补己之短。才能慢慢进步。(呵呵扯淡..)。
在Android UI操作时经常会启动一个Thread来刷新UI,通常会出现以下异常:
01-07 09:25:38.920: E/AndroidRuntime(12696): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
从上层角度来看,该异常的原因是Android的子线程中不允许刷新UI,UI操作必须放在主线程中(main)。这里大家可以参照B方法的实现,
从底层角度来看,其实子线程并非不能刷新UI的,请参照 http://www.oschina.net/question/54100_29585,该blog对子线程刷新UI,做了详细的讲解,这里就不再重复了,有意向了解的童鞋可以参考下。
不过还是建议使用B方法去实现UI刷新的操作。
不扯淡了,先看代码吧:
package com.example.pythonzz;
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.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
TextView text1,text2, text3;
Button button;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text1 = (TextView) findViewById(R.id.info1);
text2 = (TextView) findViewById(R.id.info2);
text3 = (TextView) findViewById(R.id.info3);
button = (Button)findViewById(R.id.button1);
//第一种刷新Timer,TimerTask
timer.schedule(new TimerTask() {
@Override
public void run() {
handler.sendEmptyMessage(0);
}
}, 0, 1000);//延时0秒后每隔1秒刷新一次。
//结束timer调用:
//timer.cancel();
//第二种mHandler.postDelayed(runnable, 1000);
mHandler.removeCallbacks(runnable);
mHandler.postDelayed(runnable, 1000);
//结束mHandler调用
//mHandler.removeCallbacks(runnable);
//第三种调用2次showHandler.sendMessageDelayed(message, 1000);形成循环。
startShowUI();
//取消startShowUI()的调用
//showHandler.removeMessages(0);
}
//第一种方法
Timer timer = new Timer();
private int temp1 = 0;
private Handler handler = new Handler(){
public void handleMessage(Message msg) {
text1.setText("count temp1 = " + temp1);
temp1++;
};
};
//第二种方法
private int temp2 = 0;
private Handler mHandler = new Handler();
private Runnable runnable = new Runnable() {
@Override
public void run() {
text2.setText("count temp2 = " + temp2);
temp2++;
mHandler.postDelayed(runnable, 1000);
}
};
//第三种方法
private Handler showHandler;
private int temp3 = 0;
private void startShowUI(){
showHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
text3.setText("count temp3 = " + temp3);
temp3++;
Message message = handler.obtainMessage(0);
showHandler.sendMessageDelayed(message, 1000);
}
};
Message message = handler.obtainMessage(0);
showHandler.sendMessageDelayed(message, 1000);
}
}