使用 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 类的简单计数器的主要内容,如果未能解决你的问题,请参考以下文章

等待多个AsyncTask完成

string类的写时才拷贝(Copy-On-Write)

作为类的状态是不是需要 SatefulWidget?

关于字符串类的函数的使用。

简单的计数器使用

在 C++ 中使用另一个类的对象计数在一个类中创建一个数组