Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当Android应用程序暂停时,运行多个后台任务要使用哪个并发结构?_Java_Android_Multithreading_Android Asynctask_Android Service - Fatal编程技术网

Java 当Android应用程序暂停时,运行多个后台任务要使用哪个并发结构?

Java 当Android应用程序暂停时,运行多个后台任务要使用哪个并发结构?,java,android,multithreading,android-asynctask,android-service,Java,Android,Multithreading,Android Asynctask,Android Service,我正在尝试在我的应用程序中执行多个任务,即使应用程序暂停(当应用程序失去焦点但用户尚未完全关闭应用程序时),这些任务也是继续运行所必需的 第一项任务包括建立与服务器的连接并接收更新。 第二项任务包括与配对的蓝牙设备来回通信 这两个任务都将不仅在应用程序暂停时运行,它们将在应用程序处于焦点时运行。当应用程序处于焦点时,他们需要根据收到的信息更新GUI。此外,这两项任务实际上都没有设置完成条件,除非用户决定自己停止任务,或者应用程序完全关闭,因此它们必须能够在中途取消。这两项任务很可能会运行很长时间

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

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

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

总之:

  • 两个后台任务,可在应用程序未处于焦点时运行
  • 这两项任务都需要在应用程序处于焦点时更新GUI
  • 当用户决定在应用程序内停止任务或应用程序完全关闭时,两个任务都必须能够终止
我认为我需要使用服务、IntentService或AsyncTask。
从我的阅读中,我相信我应该使用异步任务,但我想在开始之前确定一下

服务:无法操作GUI。
IntentService:无法并行运行任务,它们将在同一线程上排队。
异步任务:看起来不错


这是正确的还是我应该以某种方式结合使用呢?

你应该使用服务,服务的目的是在应用程序不在前台的情况下,有一个更小的限制生命周期可以运行。您可以使用BroadcastReceiver或callback/AIDL将消息发送回将操纵ui的调用活动。

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

即使您的活动已消失,或不再在前台(您应用程序中的另一个活动已消失,或另一个应用程序已消失),服务所做的仍然是持久的。因此,如果您需要在活动完成后运行辅助线程,则应该在服务中拥有它。如果你没有,在活动中拥有它是可以的


IntentService基本上是一种每次执行1个或多个固定长度作业的服务。它们是有用途的,但是如果它们需要执行网络IO或类似的操作,它们仍然必须派生异步任务,因为它们仍然在主线程上运行。

好的,谢谢您的回复。所以我会使用一个内部有两个线程的服务,每个线程用于我的任务吗?这绝对是一种方法。基本上,它分为两个问题:1)在我的活动结束后,我是否需要继续这个问题?如果是这样,你需要一个服务。2) 这是我想偶尔跑步还是经常跑步?如果偶尔使用异步任务,如果经常使用线程,我明白了。但是我如何操作服务中的GUI呢?我认为在服务中操纵GUI是不可能的。事实并非如此,你会通知你的活动(通过广播接收器、回调或其他方法),它会重新绘制自己。影响UI的大多数异步任务往往由活动本身拥有,尽管如果数据对多个活动有用,则通常由服务拥有它