我正在使用计时器来制作秒表。计时器通过增加整数值来工作。我想通过不断更新textview在活动中显示此值。
这是我尝试更新活动的textview的服务代码:
protected static void startTimer() {
isTimerRunning = true;
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
elapsedTime += 1; //increase every sec
StopWatch.time.setText(formatIntoHHMMSS(elapsedTime)); //this is the textview
}
}, 0, 1000);
}
我在错误的帖子中更新了UI时遇到了一些错误。
如何调整代码以完成不断更新textview的任务?
答案 0 :(得分:88)
protected static void startTimer() {
isTimerRunning = true;
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
elapsedTime += 1; //increase every sec
mHandler.obtainMessage(1).sendToTarget();
}
}, 0, 1000);
}
public Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
StopWatch.time.setText(formatIntoHHMMSS(elapsedTime)); //this is the textview
}
};
以上代码将有效......
注意:必须在主线程中创建处理程序,以便您可以修改UI内容。
答案 1 :(得分:8)
您应该使用Handler
来每隔X秒更新一次UI。这是另一个显示示例的问题:Repeat a task with a time delay?
您的方法不起作用,因为您尝试从非UI线程更新UI。这是不允许的。
答案 2 :(得分:6)
StopWatch.time.post(new Runnable() {
StopWatch.time.setText(formatIntoHHMMSS(elapsedTime));
});
此代码块基于Handler,但您无需创建自己的Handler实例。
答案 3 :(得分:2)
TimerTask实现了Runnable,这将使它成为一个线程。如果没有一些工作,您无法直接从其他线程更新主UI线程。 您可以做的一件事是使用异步任务创建计时器并每秒发布一次更新UI的更新。
答案 4 :(得分:2)
我假设StopWatch.time
是对TextView的一些静态或公共引用。您应该实现BroadcastReceiver以在您的计时器(从单独的线程运行)和TextView之间进行通信,而不是这样做。
答案 5 :(得分:2)
您可以使用以下实用程序:
.js
然后,在UI线程运行的代码中的任何地方,您都可以像这样使用它:
/**
* Created by Ofek on 19/08/2015.
*/
public class TaskScheduler extends Handler {
private ArrayMap<Runnable,Runnable> tasks = new ArrayMap<>();
public void scheduleAtFixedRate(final Runnable task,long delay,final long period) {
Runnable runnable = new Runnable() {
@Override
public void run() {
task.run();
postDelayed(this, period);
}
};
tasks.put(task, runnable);
postDelayed(runnable, delay);
}
public void scheduleAtFixedRate(final Runnable task,final long period) {
Runnable runnable = new Runnable() {
@Override
public void run() {
task.run();
postDelayed(this, period);
}
};
tasks.put(task, runnable);
runnable.run();
}
public void stop(Runnable task) {
Runnable removed = tasks.remove(task);
if (removed!=null) removeCallbacks(removed);
}
}
答案 6 :(得分:1)
您可以使用 Handler 。
此代码每隔一秒增加一个计数器,并在 textView 上显示和更新计数器值。
public class MainActivity extends Activity {
private Handler handler = new Handler();
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.text);
startTimer();
}
int i = 0;
Runnable runnable = new Runnable() {
@Override
public void run() {
i++;
textView.setText("counter:" + i);
startTimer();
}
};
public void startTimer() {
handler.postDelayed(runnable, 1000);
}
public void cancelTimer() {
handler.removeCallbacks(runnable);
}
@Override
protected void onStop() {
super.onStop();
handler.removeCallbacks(runnable);
}
}
答案 7 :(得分:0)
我使用这种方式:
String[] array={
"man","for","think"
}; int j
然后添加更多onCreate
TextView t = findViewById(R.id.textView);
new CountDownTimer(5000,1000) {
@Override
public void onTick(long millisUntilFinished) {}
@Override
public void onFinish() {
t.setText("I "+array[j] +" You");
j++;
if(j== array.length-1) j=0;
start();
}
}.start();
答案 8 :(得分:-3)
timer.schedule(new TimerTask() {
@Override
public void run() {
//your actions
}
},1*1000);//1 sec