1

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

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

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

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

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

4

2 回答 2

2

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

Android 框架没有任何方法可以阻止线程运行。线程执行由 Dalvik 管理。框架在后台停止向应用程序的主线程传递事件(除了 BroadcastIntents 之类的事件),但它不会告诉 Dalvik 暂停该进程中的所有线程。如果这样做的话,这会破坏后台处理的目的。

于 2011-07-20T17:11:22.077 回答
0

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

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

于 2011-07-20T03:07:21.623 回答