通过多次调用AsyncTask对象来更新UI

时间:2017-07-28 08:10:05

标签: android multithreading android-asynctask

我正在制作简单的应用程序,显示问题,用户应在10秒内应答或单击下一步,当用户单击下一步时,将显示下一个问题并且计时器再次进入10秒。 我正在使用Asytask来处理时间计数器,但是当我点击下一个按钮时,显示下一个问题,但是计时器延迟大约2秒左右从10开始, 例如: 在屏幕上:显示问题1,剩余时间为8秒。 当我点击下一个按钮 显示问题2,但时间为8,然后在2或3秒后,时间变为10并开始减少: 我的问题是: 有没有更好的方法来处理这个?为什么当显示下一个问题时,时间会持续2或3秒,然后从10开始 这是我的代码:

    // this method is called to reset the timer to 10 and display next 
    question

  private void displynextquestion(){
  // cancel the current thread .

     decrease_timer.cancel(true);     
   decrease_timer =new Decrease_timer();
   // execute again and set the timer to 10 seconds
   decrease_timer.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,10);
   // some code 
    }
     private class Decrease_timer extends AsyncTask <Integer ,Integer,Void>{

@Override
protected Void doInBackground(Integer... integers) {

    for (int i=integers[0];i>=0;i--){
        publishProgress(i);
        try {
            Thread.sleep(1000);

        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    return null;
}

@Override
protected void onProgressUpdate(Integer... values) {
    super.onProgressUpdate(values);
    timeview.setText(""+values[0]);
}

} }

1 个答案:

答案 0 :(得分:0)

使用CountDownTimer,更容易:

CountDownTimer countDownTimer = new CountDownTimer(10000, 1000) {

    public void onTick(long millisUntilFinished) {
        mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
    }

    public void onFinish() {
        mTextField.setText("done!");
    }
};

CountDownTimer构造函数中的第一个参数是以毫秒为单位的总时间,第二个参数是接收onTick(long)回调的时间间隔。

要重新启动,只需致电:

countDownTimer.cancel();
countDownTimer.start();

https://developer.android.com/reference/android/os/CountDownTimer.html

中查看详情