【问题标题】:Library like AsyncTask for Long-Running task [closed]用于长时间运行任务的 AsyncTask 之类的库 [关闭]
【发布时间】:2014-02-09 19:33:01
【问题描述】:

我在我的 android 应用程序中使用AsyncTask 执行短操作任务,现在我想为长时间运行的任务实现相同的东西 - 是否有任何具有相同接口的相同库?

顺便说一句,请不要推荐Service,因为我想在任务完成后更新我的用户界面!

任何建议将不胜感激!

【问题讨论】:

  • AsyncTask 本身有什么问题?
  • @M.Sameer 正如我上面提到的,根据 Android 文档,AsyncTask 不是为长时间运行而设计的。
  • 改用AsyncTaskLoader

标签: java android android-asynctask


【解决方案1】:

现在我想为长时间运行的任务实现同样的事情

这取决于“长时间运行的任务”的性质。

  • 如果持续时间不到一秒(通常),请坚持使用AsyncTask

  • 如果超过一秒但少于 15 秒,请使用IntentService

  • 如果它会超过 15 秒,但会在更长的秒数后自行结束,请使用我的 WakefulIntentService,或 WakefulBroadcastReceiverIntentService 的组合.这些对于帮助在工作进行时保持设备唤醒是必要的。

  • 1234563如果需要,也许还可以谨慎使用您自己的WakeLock

是否有任何具有相同界面的相同库?

要求我们推荐或查找工具、库或喜爱的场外资源的问题对于 Stack Overflow 来说是题外话,因为它们往往会吸引固执己见的答案和垃圾邮件。

顺便说一句,请不要建议服务

如果任务运行时间足够长以至于 AsyncTask 不合适,那么根据定义,Service 是必不可少的。

因为我想在任务完成后更新我的 UI!

当长时间运行的任务完成时,没有什么能阻止您更新 UI。使用事件总线(LocalBroadcastManager、Square 的 Otto、greenrobot 的 EventBus)。或者,使用Messenger

请记住,对于任何“长时间运行的任务”,当“任务完成”时,您的 UI 可能不再存在。

【讨论】:

    【解决方案2】:

    我通常使用Service 在任务完成后通知 UI。

    长时间运行的任务的实际工作仍然必须在 AsyncTask 上完成,因为 Service 在 UI 线程上运行。系统杀死您的任务的机会比在 Activity 上执行工作时要低。

    我通过在服务连接后使用活页夹设置来自 Activity 的回调来做到这一点。

    有关将 Activity 绑定到服务的详细信息,请参阅 http://developer.android.com/guide/components/bound-services.html

    这仅在您的 Service 和 Activity 在同一进程上时才有效。 (这是默认设置)

    【讨论】:

    • AFAIK 服务通常在 UI 线程中运行,我不确定这种方法!
    • 是的,确实如此。您必须同时使用这两种方法。
    【解决方案3】:

    有几种选择:

    1) 您也可以将AsynkTask 用于长时间运行的任务。 如果您希望一次运行多个任务,您可以使用 AsyncTask 的 executeOnExecutor(...) 方法,将 THREAD_POOL_EXECUTOR 作为第一个参数

    2) ServiceIntentService 用于异步)。 要更新 UI,您可以使用 IntentBroadcastReceiver 类。

    例子:

    在您的活动中注册一个BroadcastReceiver,这将使您的任务完成回调

    在活动中,当您想要开始一项长时间的任务时,您只需调用 startService() 并将 Intent 提供给您的 IntentService,并且已经设置了操作和附加功能。

    IntentServiceonHandleIntent() 中,您可以检查动作、传入意图的额外内容并启动您想要的任务。

    任务完成后,您只需使用Intent 调用sendBroadcast(),这将在您的活动中触发BroadcastReceiver

    就是这样。如果这很困难,你应该看看 Intents、BroadcastReceivers 和 Services 是如何工作的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-10
      • 2012-09-29
      • 2023-01-12
      • 2020-10-26
      • 1970-01-01
      • 2012-08-13
      • 2022-01-01
      • 1970-01-01
      相关资源
      最近更新 更多