我有一個接收每秒值的藍牙服務,以及每10秒接收一個位置的GPS服務。所有這些數據必須儲存在數據庫中。爲了避免這兩項服務試圖在數據庫中同時寫入數據,我創建了一個數據庫服務來存儲這些數據:藍牙和GPS服務將它們的值發送到本服務的廣播中,此服務將存儲它們。我有幾個問題:有多少意向可以接收BroadcastReceiver?
- 每秒多少次廣播可以接收我的數據庫? (使用廣播接收器) - 如果我的數據庫服務收到一個新值但尚未存儲前一個值,會發生什麼情況?
我有一個接收每秒值的藍牙服務,以及每10秒接收一個位置的GPS服務。所有這些數據必須儲存在數據庫中。爲了避免這兩項服務試圖在數據庫中同時寫入數據,我創建了一個數據庫服務來存儲這些數據:藍牙和GPS服務將它們的值發送到本服務的廣播中,此服務將存儲它們。我有幾個問題:有多少意向可以接收BroadcastReceiver?
- 每秒多少次廣播可以接收我的數據庫? (使用廣播接收器) - 如果我的數據庫服務收到一個新值但尚未存儲前一個值,會發生什麼情況?
將數據庫包裝在ContentProvider
實現中。通常,當您希望能夠將數據暴露在應用程序之外時使用它們,但它也提供了訪問結構化數據的中心且有據可查的API。您可以在內容提供者的方法中保護您的數據庫訪問權限(例如insert()
,delete()
等等)。到達提供者的初始ContentResolver
用法是您應該擁有的最大上下文切換命中。之後,幕後活頁夾連接將短路並保持在同一過程中。
您發送Intent
任何時候,該系統具有通信,以在system_server
進程中運行ActivityManagerService
。這種上下文切換是額外的開銷,你不需要和可以避免。另外,不需要隊列。只需在提供者實現中保護您的數據庫訪問。
數據庫將受到保護,只能有一個可以寫入的服務。但是如果另一個服務嘗試寫入,請求將被拒絕或服務等待? 感謝您的回答。 – Gabriel
對不起,我不明白你在問什麼。使用兩項服務可能比您需要的更復雜。 –
對不起,我的英語不好 我有2個服務:一個用於藍牙,一個用於GPS/stepcounter,並且都需要在數據庫中寫入。 如果我理解,使用Content Provider,數據庫始終受到保護,即使2個服務試圖同時寫入也是如此? 我的問題是:如果BluetoothService正在編寫,並且GPS服務想要寫入(例如),如果我理解數據庫將受到保護,但是會發生什麼? GPS服務將等到第一次寫入完成或不寫入(GPS需要重試寫入)? – Gabriel
我不知道每秒鐘可以接收的廣播數量,但是對於第二個問題,最簡單的方法可能是爲事件提供「隊列」。每次你的數據庫收到一個事件,它都會將它放入一個隊列中。然後你有一個在後臺運行的線程,並處理'Queue'來逐個插入元素。這樣,您不會丟失任何要存儲的信息,並確保每個元素都按照接收到的順序插入。 – NSimon