2011-03-17 96 views
1

我正在經歷一些設計困境,我一直在瞄準Android 2.3.3並擁有一個ContentProvider的自定義實現。然後我有一類靜態方法來抽象內容提供者 - 根據我的查詢爲我提供表示每個實體(行)的對象。有一段時間,我對這樣的工作感到非常舒服,直到我開始想在一些地方使用整個系列,進行「打擊測試」並繪製到屏幕上。然後,我對讓對象表示保持最新狀態感到頭痛,並且此時已決定我需要退後一步並重新考慮在何處採取此操作。內容提供者:用靜態外觀包裝?

正如我所說,我目前使用2.3.3,並認識到在3.0 CursorLoader克服了我遇到的很多問題。儘管如此,我仍然需要支持智能手機,所以除非有回報,否則我不能這樣做。

作爲一個臨時解決方案,我開始註冊notifyChange偵聽器,以便可以用我的原始查詢重建集合,但這會讓我感覺CPU非常密集並且速度可能很慢。我還沒有決定是否應該使用我的靜態外觀進行回滾,而是使用Activity中過時的managedQuery調用。

因此,我有兩個問題:

1)是否有preferrable的方式,以避免對基於一個ContentProvider的收集工作的問題是什麼?

2)您有任何關於在活動中使用原始遊標的建議嗎?我應該讓它們脫離它們還是使用光標原樣工作?我當然覺得在執行查詢時他們應該在AsynTask中,但在那之後我可以在任何地方使用它們?

回答

1

好吧,我來做出決定,它的工作可靠。

1)是否有一個最好的方式,以避免 與反對基於一個 ContentProvider的一個 收集工作的問題是什麼?

我決定採取的方法是正確的;在我的情況下,最好製作一個緩存而不是維護一個遊標(託管或不)到ContentProvider;這使我可以重用方法並減少需要測試的代碼量。 NotifyChange監聽器是重要的,直到3.0+工作,這意味着我應該保證NotifyChange被調用 - 集中所有這些代碼的另一個參數,以便它確實觸發預期的更改。

2)您有任何關於在活動中使用 原始遊標的建議嗎?我應該使用 使對象脫離它們還是使用 原樣使用光標?我 肯定覺得他們應該在一個 AsyncTask,同時執行查詢, 但之後,我可以在任何地方使用他們 ?

在我的使用情況下,我已經決定它是想它是什麼,我計劃建立的問題 - 避免不必要的工作,相對於返回不必要的行&領域,並可能創建不必要的對象。如果我正在尋找創建條目名稱和條目ID的地圖,那麼我不應該獲得所有其他字段。從收集中抽象出來是很好的,但它必須是輕量級的,並考慮數據的使用方式 - 無論是一次性的還是可以重複使用的。重要的是它是爲了表現而不是完整性而寫的。

+0

我曾經想過的一個問題是靜態的,這種方法使得代碼的依賴性是隱含的。應該使用對象實例。這不會影響它在創建方法中使用的活動(不會使用params),但會影響異步任務和其他組件 – Uniqe 2011-05-26 11:03:58