ProgressBar 使用 AsyncTask 并处理 GoogleMap 对象
Posted
技术标签:
【中文标题】ProgressBar 使用 AsyncTask 并处理 GoogleMap 对象【英文标题】:ProgressBar using AsyncTask and working on GoogleMap object 【发布时间】:2015-06-12 05:40:48 【问题描述】:我使用 AsyncTask 从 db 中检索数据(在 doOnBackground() 中),并准备将其显示给用户。在这些操作过程中,ProgressBar 完美地旋转。
当我需要对对象GoogleMap进行操作绘制折线、标记等时,所有这些工作都由onPostExecute()完成,ProgressBar停止旋转。
有一种方法可以在“GoogleMap”上操作并让 ProgressBar 旋转,以便通知用户该应用正在运行吗?
谢谢
【问题讨论】:
在 AsyncTask 的 onPreExecute() 方法中显示 ProgressDialog 并在 onPostExecute() 中完成对话框.. 在 doInBackground() 中完成所有任务.. 我可以从 doOnBackground() 对 GoogleMap 对象进行操作而不违反“不要从 UI 线程外部访问 android UI 工具包”的规则吗? 你的错误是什么?你卡在哪里了? @Heshan Sandeepa 没有错误,我在问是否有办法在 ProgressBar 继续旋转的同时更新 GoogleMap 对象(需要几秒钟的更新)。 【参考方案1】:定义一个本地 Progress 类,它可以保存地图更新所需的所有信息。然后就可以一一发布进度,在onProgressUpdate中更新地图。 OnProgressUpdate 不仅限于更新进度条。
【讨论】:
我试过了,但是没有用,因为在 doOnBackground() 中有一个 For cicle 来添加所有的折线、标记,......并且每次它调用 onProgressUpdate() ,这需要一些时间来更新对象 GoogleMap,同时 doOnBackground() 中的 For cicle 继续运行。最后,我在对象 GoogleMap 中只有很少的更新。 啊,我明白了。我认为您可以在 doOnBackground 中保存一个同步队列,在其中推送信息。然后将此队列传递给 onProgressUpdate(使用本地 Progress 类)。如果您使用 BlockingQueue,请确保不要尝试从 UI 线程中的空队列进行轮询! 我尝试过这样的事情,每次我调用 publishProgress() (因为 doOnBackground 中的 for cicle 前进了 1 步)我将布尔检查设置为 false,所以 doOnBackground 中的 cicle 不能去直到此检查为真。当 onProgressUpdate() 完成它的工作时是真的。它可以工作,但不是很好,因为它需要 80 秒以上的 mw 而不是一些秒计算。遗憾。现在我使用阻止旋转(或不需要旋转的消息)。 你为什么停在doOnBackground?这样,您当然是在序列化这两个任务,并且两次都会总结。对于并发工作,doOnBackground 方法应该不断地推入队列并发布它,而 onProgressUpdate 应该从队列中拉出并绘制它。以上是关于ProgressBar 使用 AsyncTask 并处理 GoogleMap 对象的主要内容,如果未能解决你的问题,请参考以下文章
在 Android 应用程序中使用 AsyncTask 在 for 循环期间更新 ProgressBar
在从 Internet 下载数据期间,在 AsyncTask 的 onProgressUpdate 中显示确定的 ProgressBar
Activity UI Handler ProgressBar AsyncTask