2010-08-26 53 views
2

我一直在關注Virgil在Google I/O上關於REST大量應用程序的演示。服務中的數據庫調用

Google I/O 2010 - Android REST client applications

雖然記事本教程使得數據庫直接從用戶界面層調用,維吉爾表明在一個服務使數據庫調用。

目前,我的Activity的onCreate方法使用擴展的ContentProvider訪問SQLite數據庫以查詢附加到Activity的ListView的Cursor。

我想將此代碼移入服務。很簡單。我的問題是,將光標轉移回UI層的適當方式是什麼?我看到了很多提出的問題,似乎總有人提出有更合適的方法來做到這一點。那是什麼?

更具體地說,我到目前爲止已經認識到Activity應該註冊爲某種監聽器。當在服務中檢索到遊標時,會向UI層設置通知以訪問它。服務在哪裏推動它,以便活動可以抓住它?

此外,我認爲的體系結構是有一個擴展的服務,這是由活動調用。在本服務中,數據庫事務將通過使用擴展的ContentProvider進行,任何偵聽活動都將被通知,並且線程將啓動以打擊Web服務。所以,我有1個擴展的服務,1個擴展的ContentProvider和幾個擴展的線程用於不同的Web服務。這看起來可以接受嗎?

+0

再次觀看視頻,看起來Virgil建議在Activity和Service之間建立一個叫做「Service Helper」的Singleton層。從這個角度來看,我假設在這個Singleton中有各種ListActivities的Cursor對象?一旦服務完成檢索並將光標放入服務助手Singleton中,活動會被通知來獲取它?我不太確定這一點,因爲他提到使用活頁夾回調來通知服務助手。爲什麼需要一個可以被引用的單例的回調? – Andrew 2010-08-26 15:45:08

回答

1

我只是在我的Activity中使用managedQuery調用來獲取遊標。這是一個相當輕的操作,我不認爲它會阻礙用戶界面。

我創建了一個服務,然後調用Web服務來查找新數據。如果找到新數據,它將被放置在我的數據庫中,並且sendBroadcast被調用。我的Activity有一個註冊的BroadcastReceiver,它聽到廣播並在Cursor上調用了requery()。

0

你有沒有考慮實施裝載機?

我有一個應用程序使用意圖服務從服務器獲取數據,並使用ContentProvider存儲 他們。然後,需要該數據的片段或活動實施 LoaderCallbacks<Cursor>onCreateLoaderonLoadFinishedonLoaderReset)。

onCreateLoader我實例化一個CursorLoader對象,並返回它在onLoadFinished我確保光標的數據顯示在我的Fragment/Activity

檢查the official loaders guide