【问题标题】:Android Design : How to run 3 different threads in Background for monitoring 3 different devicesAndroid 设计:如何在后台运行 3 个不同的线程来监控 3 个不同的设备
【发布时间】:2025-12-17 06:30:01
【问题描述】:

我有一个应用程序,我想通过 Android 手机监控 3 个蓝牙设备的状态。为此,我需要向每个设备发送一些数据,并每 5 秒检查一次它们的响应是否正确。而且我希望即使应用程序不在前台也能进行此处理。我想了不同的解决方案,但我想不出任何好的解决方案。

  • 我想到了使用 IntentService。但是 IntentService 使用一个线程来完成所有处理。但我想要 3 个不同的线程,因为每次检查之间的 5 秒时间很短,我无法在单个线程中检查设备之间跳转。

  • 我想过使用 3 种不同的 IntentService。但不确定,如果这是最好的方法吗?

  • 我想使用一个服务并产生 3 个线程,一个 foreach 设备。但我不确定当应用不在前台时这些线程是否会运行。

    运行这种在应用程序中进行后台处理的应用程序的最佳设计是什么,即使应用程序不在前台并且它必须运行 3 个不同的线程。

【问题讨论】:

    标签: android multithreading service intentservice


    【解决方案1】:

    一个服务,三个线程就是你想要的。让一个线程在多个设备上执行 I/O 似乎就像在自找麻烦,它创建了一个不必要的依赖关系。无论应用程序是前台还是后台,所有线程都会执行。

    Android 框架无法阻止线程运行。线程执行由 Dalvik 管理。框架在后台停止向应用程序的主线程传递事件(除了 BroadcastIntents 之类的事件),但它不会告诉 Dalvik 暂停该进程中的所有线程。如果确实如此,这将有点违背后台处理的目的。

    【讨论】:

      【解决方案2】:

      您不一定需要三个线程。你肯定需要三个 BluetoothSocket 。您可能只需让一个服务从 onStartCommand() 启动一个线程并在 onDestroy() 中将其终止,就可以实现这一目标。线程应该循环并检查每个设备是否有活动连接,如果没有,它应该尝试重新连接。一旦建立连接,它应该根据其协议写入设备然后从设备读取。没有什么可以阻止您在同一线程中写入/读取多个设备。您可以为此使用非阻塞 IO,检查每次迭代中是否有要读取的字节,直到找到它们,然后根据收到的内容采取行动。

      就配对/绑定而言,我会在检查设备的线程之外执行此操作,因为您可能希望指示用户输入引脚/配对设备。只需让后台线程对三个设备中的每一个进行读/写即可。你可能会发现你想要多个线程,这纯粹是一个口味问题......只需要一个线程。

      【讨论】:

      • 我最初也是用同样的方式设计的。但后来我遇到了一个问题,我试图重新连接一个设备,因为它阻塞了,其他 2 个设备的跟踪不会在那个时候发生。根据 BluetoothSocket 文档,读写是阻塞的。我的另一个疑问是,如果我从服务创建线程,它是否会在应用程序进入后台后运行。
      最近更新 更多