【问题标题】:Which concurrency construct to use for running multiple background tasks when the app is paused for Android?当应用程序为 Android 暂停时,使用哪种并发构造来运行多个后台任务?
【发布时间】:2014-12-18 23:23:36
【问题描述】:

我正在尝试在我的应用程序中实现多个任务,即使在应用程序暂停(当应用程序失去焦点但用户尚未完全关闭应用程序时)也需要这些任务继续运行。

第一项任务包括建立与服务器的连接并接收更新。
第二个任务包括与配对的蓝牙设备来回通信。

这两个任务不会仅在应用暂停时运行,它们需要在应用处于焦点时运行。当应用程序处于焦点时,他们将需要根据收到的信息更新 GUI。此外,除了用户决定自己停止任务或应用程序完全关闭时,这两个任务都没有真正的完成条件,因此它们必须能够在中间过程中被取消。这两个任务很可能会运行很长时间。

总结:

  • 应用不在焦点时可以运行的两个后台任务。
  • 当应用处于焦点时,这两个任务都需要能够更新 GUI。
  • 当用户决定在应用内停止任务或应用完全关闭时,这两个任务都必须能够终止。

我认为我需要使用 Service、IntentService 或 AsyncTask。
根据我的阅读,我相信我应该使用 AsyncTask,但我想在开始之前确定。

Service:无法操作 GUI。
IntentService:无法并行运行任务,它们将在同一个线程中排队。
AsyncTask:看起来不错!

这是正确的还是我应该以某种方式使用多种事物的组合?

【问题讨论】:

    标签: java android multithreading android-asynctask android-service


    【解决方案1】:

    你误解了Service和IntentService的意思。它们不是并发机制。它们不会在后台自动运行。它们与您的应用程序在同一线程上运行。如果需要并发,则需要 AsyncTask 或 Thread。请注意,如果您使用 AsyncTask 在多个任务之间获得真正的并发,您仍然需要使用 executeOnExecutor()。

    即使您的 Activity 消失或不再处于前台(您的应用中的另一个 Activity 存在,或者另一个应用存在),Services 所做的也是持续存在。因此,如果您需要在 Activity 完成后运行辅助线程,则应该将其拥有在 Service 中。如果你不这样做,在 Activity 中拥有它就可以了。

    IntentService 基本上是一次执行或多或少固定长度作业 1 的服务。它们是有用途的,但如果它们需要做网络 IO 或类似的事情,它们仍然必须分离 AsyncTasks,因为它们仍然在主线程上运行。

    【讨论】:

    • 好的,谢谢您的回复。那么我会使用一个内部有两个线程的服务,一个用于我的每个任务吗?
    • 这绝对是一种方法。基本上它分为两个问题 - 1)在我的活动完成()后我需要继续吗?如果是这样,您需要一项服务。 2)这是我想偶尔运行还是经常运行的东西?如果偶尔使用AsyncTask,如果经常使用Thread。
    • 我明白了。但是我将如何操作服务中的 GUI?我认为不可能在服务中操作 GUI。
    • 不是,你会通知你的活动(通过广播接收器、回调或其他方法),它会重新绘制自己。大多数影响 UI 的 AsyncTask 往往归 Activity 本身所有,尽管如果数据对多个 Activity 有用,那么服务拥有它并不少见
    【解决方案2】:

    您应该使用服务,服务的目的是在应用程序不在前台时可以运行的受限制更少的生命周期。您可以使用 BroadcastReceiver 或回调/AIDL 将消息发送回将操作 ui 的调用活动。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-02
      • 2020-11-15
      • 1970-01-01
      • 2015-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多