2016-04-22 90 views
1

我有一個接收每秒值的藍牙服務,以及每10秒接收一個位置的GPS服務。所有這些數據必須儲存在數據庫中。爲了避免這兩項服務試圖在數據庫中同時寫入數據,我創建了一個數據庫服務來存儲這些數據:藍牙和GPS服務將它們的值發送到本服務的廣播中,此服務將存儲它們。我有幾個問題:有多少意向可以接收BroadcastReceiver?

- 每秒多少次廣播可以接收我的數據庫? (使用廣播接收器) - 如果我的數據庫服務收到一個新值但尚未存儲前一個值,會發生什麼情況?

+0

我不知道每秒鐘可以接收的廣播數量,但是對於第二個問題,最簡單的方法可能是爲事件提供「隊列」。每次你的數據庫收到一個事件,它都會將它放入一個隊列中。然後你有一個在後臺運行的線程,並處理'Queue'來逐個插入元素。這樣,您不會丟失任何要存儲的信息,並確保每個元素都按照接收到的順序插入。 – NSimon

回答

0

將數據庫包裝在ContentProvider實現中。通常,當您希望能夠將數據暴露在應用程序之外時使用它們,但它也提供了訪問結構化數據的中心且有據可查的API。您可以在內容提供者的方法中保護您的數據庫訪問權限(例如insert(),delete()等等)。到達提供者的初始ContentResolver用法是您應該擁有的最大上下文切換命中。之後,幕後活頁夾連接將短路並保持在同一過程中。

您發送Intent任何時候,該系統具有通信,以在system_server進程中運行ActivityManagerService。這種上下文切換是額外的開銷,你不需要和可以避免。另外,不需要隊列。只需在提供者實現中保護您的數據庫訪問。

+0

數據庫將受到保護,只能有一個可以寫入的服務。但是如果另一個服務嘗試寫入,請求將被拒絕或服務等待? 感謝您的回答。 – Gabriel

+0

對不起,我不明白你在問什麼。使用兩項服務可能比您需要的更復雜。 –

+0

對不起,我的英語不好 我有2個服務:一個用於藍牙,一個用於GPS/stepcounter,並且都需要在數據庫中寫入。 如果我理解,使用Content Provider,數據庫始終受到保護,即使2個服務試圖同時寫入也是如此? 我的問題是:如果BluetoothService正在編寫,並且GPS服務想要寫入(例如),如果我理解數據庫將受到保護,但是會發生什麼? GPS服務將等到第一次寫入完成或不寫入(GPS需要重試寫入)? – Gabriel

相關問題