【问题标题】:Howto to associate a progressdialog with a service in Android如何将进度对话框与 Android 中的服务相关联
【发布时间】:2011-12-28 12:35:54
【问题描述】:

我有一个使用AsyncTask 的同步服务。由于其目标(同步),我更喜欢阻止用户并向他显示进度对话框。 (如果存在则错误)

另一个困难是我有大约 8 个AsyncTask 同时运行。所以我不能在开始工作时简单地调用进度对话框页面,并在完成时关闭。它更复杂。

有人可以帮我完成这项任务吗?

问候

【问题讨论】:

  • 服务到底是什么意思?您实际上是在运行一项服务,还是在您的 Activity 中有执行这些任务的组件?
  • 我有一个继承自 android Service 的类。当启动该服务调用 asynctask(json web 服务)并且有答案时,asynctask 回调一个服务函数。该函数调用正确的函数(例如 FillUsers)。

标签: java android


【解决方案1】:

AsyncTask 中的onPreExecute()onProgressUpdate(Progress...)onPostExecute(Result) 在UI 线程上调用。您可以使用它们来显示进度条,在同步进行时对其进行更新,并在工作完成时将其隐藏。

关于 8 个并发异步任务,你真的需要 8 个并发任务吗?您不能使用单个 AsyncTask 在一个后台线程上按顺序运行它们吗?

【讨论】:

  • 服务调用了异步任务。服务可以调用进度对话框还是受限于活动?而且不需要8个并发任务,我正在重写代码……
【解决方案2】:

首先,服务的重点是您不需要/不想阻止用户做某事,因为它发生在后台。在这方面,Service 没有 UI 线程,因此如果您希望在 Activity 中显示进度条,则必须将 Intent 发送回您的 Activity(使用广播接收器),以便您可以切换进度酒吧开/关并做其他魔术。

但我不建议屏蔽该用户,因为您正在执行的任务可能需要很长时间,这会给用户体验带来不便。您甚至可能想要重新考虑使用服务(如果您获取的数据仅在本地使用;例如获取最新的 twitter 消息或其他内容)并在您的 Activity 中使用 ASyncTask,除非您的服务获取的数据是也用于您应用的其他部分(例如小部件),并且即使 Activity 未运行,您也希望该数据可用。

【讨论】:

  • 我的应用程序必须同步数据。这是一个业务应用程序,我想同步客户等数据,以及用户是否选择用户以及该用户是否隐藏。可能会有一些奇怪的行为。我不记得我为什么要使用服务,有些东西不起作用,也许现在可以起作用了……就我而言,我想要两个主要功能 1) 在同步完成时告诉用户 2)说有没有失败(请重试)
  • 在这种情况下,您必须让服务通过意图广播通知活动同步已完成/失败,活动可以通过意图过滤器或特定广播接收器接收,或者也许在 android 通知栏中显示通知。
【解决方案3】:

你可以使用progress dialog 来显示等待光标。 您也可以在应用程序中模仿CountDownLatch 的概念来消除光标。就像您可以在 updateTaskComplete 之类的类中拥有静态函数并更新静态计数器。一旦计数器等于异步任务的数量,则在函数 updateTaskComplete 中取消进度光标。我的意思是你必须在这条线上做点什么。

【讨论】:

    猜你喜欢
    • 2016-07-19
    • 1970-01-01
    • 2011-01-09
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    相关资源
    最近更新 更多