使用 AsyncTask 类的简单计数器
Posted
技术标签:
【中文标题】使用 AsyncTask 类的简单计数器【英文标题】:Simple counter using AsyncTask class 【发布时间】:2019-01-23 22:40:42 【问题描述】:这是一个:
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]));
i 是一个整数女巫,每 0.2 秒上升一次,它的值显示在 Textview 中。因此,当我运行我的应用程序时,i 的值显示在 textview 中,并使用 asynctask 类快速增加和更新。 这是我的问题: 为什么有时我的文本视图显示较小的 i 值,例如在 54 之后显示为 53,然后再次上升!
【问题讨论】:
【参考方案1】:onProgressUpdate(Progress...),调用后在 UI 线程上调用 发布进度(进度...)。执行时间为 不明确的。此方法用于显示任何形式的进度 后台计算仍在执行时的用户界面。 例如,它可以用于动画进度条或显示登录 一个文本字段。
您的 UI 线程上的更新时间无法保证,因此您可能会看到事件按照您描述的顺序出现故障。您可能希望在进度中添加逻辑,根本不减少值而只会增加,如果值小于您上次看到的值,则基本上跳过该值。
【讨论】:
所以我们可以说时间不能保证,但是它如何显示变量的先前值?!也许它更新需要更长的时间但它无法显示最后一个值...... 我认为你应该假设如果不能保证时间,订单可能会受到影响。【参考方案2】:有主UI线程和其他工作线程,要使用AsyncTask更新Textview,你应该使用publishProgress
官方帮助给出了详细的解释和示例,阅读并尝试修改你的代码。
【讨论】:
【参考方案3】:您不应该通过 AsyncTask 来实现它。所有 AsyncTask 共享同一个线程,在它上面休眠会阻塞系统中的任何其他任务。这仅适用于非常短的任务。如果您的计时器永远运行,那么您的应用程序中的其他异步任务将永远无法工作。如果您想要一个计时器,请使用处理程序或线程,而不是 AsyncTask。
【讨论】:
没关系,兄弟。但是你能解释一下我是如何收到一个较小的 i 变量值的吗?它是如何发生的?我必须看到相等或更高的值,因为没有减少它的命令!以上是关于使用 AsyncTask 类的简单计数器的主要内容,如果未能解决你的问题,请参考以下文章