2015-01-12 76 views
0

我的應用程序連接到多個SPP藍牙設備,所有這些設備流數據。有四個設備流式傳輸,一個是250赫茲,另一個是100赫茲。我想將它們放在Service中,但也希望每個設備都在單獨的Thread中運行。每個Thread還必須連接到SQLite數據庫以實時插入數據。設備可以長時間連接,並可隨時斷開連接並隨時重新連接。一旦開始應用程序可能會運行24小時或更長時間,並始終在尋找已配對設備的可用性。Android服務與意圖服務連接到多個藍牙設備

的問題是:是否有更好的性能,明智的做法是在一個單獨的Service爲此運行多個Thread S(每個連接裝置Thread)或者是更好地運行一個單獨的IntentService(這當然會在運行它自己的工作Thread

我已閱讀在SO和其他地方關於這個很多其他的問題和答案,可以看到優點和做法的利弊,但我無法找到明確回答我的問題的答案。我不知道如果正在運行有時Service中的多個Thread將不會阻止主Thread另一方面,我不認爲我可以同時在IntentService中運行多個Thread

+1

即使使用IntentService,也需要啓動後臺線程,因爲IntentService使用一個後臺線程來處理所有請求 – pskink

+0

爲什麼不等到有人回答[您的問題的第一個副本](http://stackoverflow.com/questions/ 27870810 /運行,多服務上,Android的換藍牙功能的設備)? – 323go

+0

@pskink謝謝你的回覆。我仍然不確定運行IntentService的好處,因爲它排隊並且不會並行處理,至少這是我所理解的。 – Bohmian

回答

1

在您的預期情況下,IntentService不是一個壞主意,但不是你提出的方式。基於該documentation

IntentService是對於處理需求異步 請求(表示爲意圖)服務的基類。客戶通過startService(Intent)調用發送請求 ;該服務根據需要啓動, 依次使用工作線程處理每個Intent,並在其用完時停止其自身 。

此「工作隊列處理器」模式通常用於從應用程序的主線程卸載任務 。 IntentService類存在到 簡化了這種模式並照顧了機制。要使用它, 擴展IntentService並實現onHandleIntent(意圖)。 IntentService將收到意圖,啓動工作線程,並且 根據需要停止該服務。

所有請求都在單個工作線程上處理 - 它們可能需要多長時間(並且不會阻止應用程序的主循環),但是一次只能處理一個請求。

因此,爲每個藍牙設備啓動一個IntentService意味着其中一個或另一個將被阻止。每當我與多個套接字(設備)進行通信時,我都會爲每個套接字分配一個線程......此線程隨後負責根據需要連接到套接字,與套接字進行通信以及重新連接套接字。這種模式與在任何服務器程序中使用的模式相同:每個連接都有一個ClientThread,它由連接偵聽器產生。

但是,對於IntentService也是一個很好的選擇:將數據傳遞給您的sqlite數據庫非常好。將數據放在一個意圖中,將它發送到您的IntentService,它將在需要時打開數據庫(可能甚至啓動一個事務),然後發佈所有數據,並在其用完時提交事務並關閉數據庫。API提供了許多必要的管道。

+0

謝謝你這個有用的答案。我原來的設計有多個線程用於設備套接字,但運行在主要活動中,我收集的並不是最好的實現。所以,我正在將連接等移動到服務或IntentService。當你說你將一個線程分配給每個套接字時,你的意思是在一個IntentService中?再次感謝! – Bohmian

+0

我會使用調度程序線程來產生新的客戶端線程。 – 323go

+0

再次感謝您的幫助。 – Bohmian