这是使用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,然后再次升高!
答案 0 :(得分:0)
onProgressUpdate(Progress ...),在调用后在UI线程上调用 到publishProgress(Progress ...)。执行的时间是 未定义。此方法用于显示进度中的任何形式的进度 用户界面,而后台计算仍在执行。 例如,它可以用于为进度栏设置动画或显示日志 一个文本字段。
不能保证UI线程上更新的时间,因此您可以看到事件如您描述的那样乱序。您可能希望在进度中添加逻辑,以使根本不减少该值,而仅增加该值,如果该值小于上次看到的值,则基本上跳过该值。
答案 1 :(得分:0)
有主UI线程和其他辅助线程,要使用AsyncTask更新Textview,应使用publishProgress
官方帮助给出了详细的说明和示例,请仔细阅读并尝试修改代码。
答案 2 :(得分:0)
您不应该通过AsyncTask来实现它。所有AsyncTasks共享同一个线程,在该线程上休眠将阻止系统中的任何其他任务。这仅适用于非常短的任务。如果您的计时器永远运行,则您应用中的其他异步任务将永远无法运行。如果需要计时器,请使用处理程序或线程,而不要使用AsyncTask。