使用AsyncTask类的简单计数器

时间:2018-08-16 22:19:08

标签: android android-studio android-asynctask

这是使用AsyncTask类的简单计数器:

   static private class AsyncTaskRunner extends AsyncTask<Integer, Integer, Integer> {

    @Override
    protected Integer doInBackground(Integer...prams) {
       while(t){
           i++;
           publishProgress(i);
           try {
               Thread.sleep(200);
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
       }

        return null;
    }


    @Override
    protected void onPostExecute(Integer result) {

    }


    @Override
    protected void onPreExecute() {

    }


    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        Textview.setText(String.valueOf(values[0]));  
    }
}

我是一个整数女巫,每0.2秒上升一次,其值在Textview中显示。因此,当我运行我的应用程序时,i的值在textview中显示,并使用asynctask类快速增加和更新。 这是我的问题: 为什么有时我的“文本”视图显示较小的i值,例如,在54之后显示53,然后再次升高!

3 个答案:

答案 0 :(得分:0)

  

onProgressUpdate(Progress ...),在调用后在UI线程上调用   到publishProgress(Progress ...)。执行的时间是   未定义。此方法用于显示进度中的任何形式的进度   用户界面,而后台计算仍在执行。   例如,它可以用于为进度栏设置动画或显示日志   一个文本字段。

不能保证UI线程上更新的时间,因此您可以看到事件如您描述的那样乱序。您可能希望在进度中添加逻辑,以使根本不减少该值,而仅增加该值,如果该值小于上次看到的值,则基本上跳过该值。

答案 1 :(得分:0)

有主UI线程和其他辅助线程,要使用AsyncTask更新Textview,应使用publishProgress

官方帮助给出了详细的说明和示例,请仔细阅读并尝试修改代码。

答案 2 :(得分:0)

您不应该通过AsyncTask来实现它。所有AsyncTasks共享同一个线程,在该线程上休眠将阻止系统中的任何其他任务。这仅适用于非常短的任务。如果您的计时器永远运行,则您应用中的其他异步任务将永远无法运行。如果需要计时器,请使用处理程序或线程,而不要使用AsyncTask。