【发布时间】:2012-05-11 06:39:19
【问题描述】:
在我的项目中,我想在加载页面时从 3 个不同的 url(webservice)并行加载数据。
为此,我使用 3 个不同的异步任务来加载数据。
我想在第一个异步任务启动时将进度对话框消息显示为“正在加载”,并在最后一个异步任务完成后关闭对话框(直到完成 3 个任务显示进度对话框)。
请告诉我如何处理这种情况。
【问题讨论】:
标签: android android-asynctask progressdialog
在我的项目中,我想在加载页面时从 3 个不同的 url(webservice)并行加载数据。
为此,我使用 3 个不同的异步任务来加载数据。
我想在第一个异步任务启动时将进度对话框消息显示为“正在加载”,并在最后一个异步任务完成后关闭对话框(直到完成 3 个任务显示进度对话框)。
请告诉我如何处理这种情况。
【问题讨论】:
标签: android android-asynctask progressdialog
有不同的方法来处理这种情况。
您可以使用使用任务数初始化的计数器变量,当AsyncTask 完成时,此计数器会递减。当计数器为 0 时,ProgressDialog 被解除。您可以在每个AysncTask 的onPostExecute 中执行此递减并检查进度对话框关闭。
您可能不需要 3 个不同的 AsyncTasks。您可以使用单个 AsyncTask 和 CountDownLatch 进行 Thread 同步。
【讨论】:
您可以做的一种方法是创建一个接口OnThreadFinishListener(使用onThreadFinish() 方法)并让您的活动实现它。您的所有AsyncTask 都应将自己注册到侦听器,因此每次线程完成时都会调用onThreadFinish 方法。在 onThreadFinish 方法中,它应该检查是否仍有线程在后台运行(类似于 if (asyncTask1.getStatus() == AsyncTask.Status.RUNNING || asyncTask2.getStatus() == AsyncTask.Status.RUNNING ... ) )
如果全部为假,那么您可以关闭progress dialog。
【讨论】:
你可以这样做:
//define progress dialog object globally in your parent class
ProgressDialog pd = null;
AsyncTask1 onPreExecute:
pd = ProgressDialog.show(this, "title", "loading", true);
AsyncTask2:
//do nothing
AsyncTask3 onPostExecute:
if(pd!=null)
pd.dismiss();
【讨论】: