我想使用CountDownTimer从后台线程更新UI线程中的文本,该线程只计算剩余时间。
我继承了一个线程,并在其构造函数中传递了主线程处理程序,并在CountDownTimer方法中创建了一个新的run方法来更新主ui线程中的文本视图,如下所示:
class MyCounter extends Thread
{
private Handler uiHandler;
private long timeToCount;
public MyCounter(Handler handler, long time)
{
this.uiHandler = handler;
this.timeToCount = time;
}
public void run()
{
new CountDownTimer(timeToCount, 1000){
public void onTick(long millisUntilFinished) {
Message msg = Message.obtain();
String timeString = //....here I conver millisUntilFinished to String format
msg.obj = timeString;
uiHandler.sendMessage(msg);
}
.... //Other method of CountDownTimer
}.start();
} //end of run
} //end of thread class我创建了MyCounter线程,并在我的活动UI (主线程)上调用start,传递一个在主线程中创建的处理程序。在我的主活动中调用start后,CountDownTimer似乎没有被调用。
有什么想法吗?
发布于 2014-12-03 15:26:21
我认为为了更新活动中的文本视图,你必须使用runOnUiThread,例如:
runOnUiThread(new Runnable() {
@Override
public void run() {
textview1.setText(content);
});发布于 2014-12-03 15:33:20
我认为对于这种典型的情况,即以固定的时间间隔运行一些东西,计时器更合适。下面是一个简单的例子:
myTimer = new Timer();
myTimer.schedule(new TimerTask() {
@Override
public void run() {
// If you want to modify a view in your Activity
MyActivity.this.runOnUiThread(new Runnable()
public void run(){
tv.append("Hello World");
}
);
}
}, 1000, 1000); // initial delay 1 second, interval 1 second使用计时器有几个优点:初始延迟和间隔可以很容易地在调度函数参数中指定计时器可以通过简单地调用myTimer.cancel()来停止计时器如果只想让一个线程运行,请记住在调度新线程之前调用myTimer.cancel() (如果myTimer不为空)
发布于 2014-12-03 15:36:27
new CountDownTimer(timeToCount, 1000){
public void onTick(long millisUntilFinished) {
runOnUiThread(new Runnable() {
public void run()
{
Message msg = Message.obtain();
String timeString = //....here I conver millisUntilFinished to String format
msg.obj = timeString;
uiHandler.sendMessage(msg);
}
});
}
}.start();https://stackoverflow.com/questions/27265760
复制相似问题