AsyncTask 和进度条 [重复]

Posted

技术标签:

【中文标题】AsyncTask 和进度条 [重复]【英文标题】:AsyncTask and Progress Bar [duplicate] 【发布时间】:2014-02-05 21:14:51 【问题描述】:

我有发送(多个文本文件)到服务器的应用程序,每个文件发送和获取响应都会更新进度条。一旦所有文件都发送完毕,它就会被关闭。

我已经通过在循环中调用发送函数成功地实现了这一点,并且进度条得到了更新。现在我想 AsyncTask 为每个文件执行 http 请求,同时进度条也得到更新。

如何定义 AsyncTask 以发送特定文件并获得响应。在它发送的每个文件上,进度条也会更新?

任何帮助将不胜感激。

谢谢

-山姆

【问题讨论】:

您到底想知道什么?如何将参数传递给 AsyncTask?或者如何从 Asynctask 更新 ProgressBar? 我在进度条循环内调用new PostDataAsyncTask().execute(currentFile),它会抛出异常,即不能在非 UI 线程中调用 AsyncTask。然后如何更新 ProgressBar 以及在哪里创建 AsyncTask 实例? 【参考方案1】:

如果您想更新您的ProgressBar,同时仍在您的AsyncTask 中执行,您应该...

在您的AsyncTask 中实现onProgressUpdate(...) 方法。

如果您想在doInBackground(...) 期间更新进度条,请致电publishProgress(...)

AsyncTask documentation 中有一个这样的例子。

【讨论】:

【参考方案2】:

您必须从主/UI 线程调用 AsyncTask。您不能从后台线程启动 AsyncTask。 尝试从 onCreate() 调用 new PostDataAsyncTask().execute(currentFile)。 正如 Yjay 所说,您可以使用 onProgressUpdate()publishProgress() 来更新 ProgressBar 的值。

【讨论】:

【参考方案3】:

这个问题在很多地方都被问及过。关键是使用doInBackground() 方法执行网络活动,然后您可以根据需要从那里调用publishProgress() 以更新对话框。您还需要覆盖 onProgressUpdate(),因为这是 publishProgress() 调用的方法,并且您将在其中放置对话框代码。

android documentation for AsyncTask android how to work with asynctasks progressdialog Download a file with Android, and showing the progress in a ProgressDialog How to use Asynctask effectively How to use AsyncTask correctly in Android 更多...

【讨论】:

在主 UI 线程中单击按钮时,我的进度条会在一个新线程中生成。然后我在哪里实例化 AsyncTask?在这种情况下,我该如何启动 progressBar? 这个想法是,您启动 AsyncTask 以进行网络 I/O 以发送文件,一旦文件完成,您可以调用 publishProgress(),可选地使用一些参数。一旦你这样做,它会触发onProgressUpdate(),这就是你应该更新你的 ProgressBar 的地方。不是您通过“单击按钮时产生一个新线程”来描述它的方式。请阅读文档和链接。

以上是关于AsyncTask 和进度条 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

水平进度条不适用于 Asynctask Android 下载文件?

自定义对话框片段内的进度条 - 如何从 AsyncTask 传递进度?

在 AsyncTask 中显示进度条

AsyncTask onPreExecute() 中未显示进度条

如何使用 asynctask 执行数据库操作来实现进度条?

我想在 RxJava 中使用进度条,就像在 AsyncTask 中一样