2012-03-06 28 views
4

只是好奇。ContentProvider線程

getContentResolver().query(...) 

我知道Loaders在後臺線程上運行查詢。這是否也適用於插入,更新和刪除?我應該創建AsyncTasks,Threads等等這些類型的調用嗎? 大的更新可能會阻止我的應用程序的主線程。

getContentResolver().insert(...) 

謝謝!

回答

5

Content Provider Basics

從提供商

檢索數據本節描述如何從提供商檢索數據,使用 用戶詞典提供商,例如,

爲了清楚起見,在的「UI線程」」在這個區間調用 ContentResolver.query()的代碼片段在實際的代碼,但是, 你應該在單獨的線程做查詢異步。一種方法 做到這一點是使用CursorLoader類,這是在更 詳細裝載機指南中描述的同樣,代碼行是片段 僅;它們不顯示完整的應用

1

裝載機僅適用於查詢,即在活動或碎片中加載數據,其他t韓插入/更新/刪除。

除了Loader,自Android 3.0以來,android確實提供了一個幫助類AsyncQueryHandler,因爲API級別1支持異步CRUD類操作,支持完整的CRUD回調。

AsyncQueryHandler內部使用HandlerThread進行異步操作,並將結果傳遞迴主線程。使用AsyncTask或簡單的工作線程在特定需求方面也是流行的做法。

1

當你說Loaders在後臺線程上運行查詢時,你需要明白它是在後臺線程中執行查詢的Loader類的實現。

這樣做的結果是您將要使用或擴展並實現抽象Loader類的子類,而不使用AsyncTask或Java線程。原因是當你創建一個Loader時,它希望你返回一個Loader類型的實例。 Java線程或AsyncTask不能用於此。 Loader類的子類通過啓動它們自己的線程來完成此操作。客戶端類或創建Loader的類僅初始化Loader。實際的Loader實例可以做任何你想做的事情。這可以是任何東西 - 插入,更新,刪除等。Android提供的CursorLoader實現從後臺線程中的表異步查詢數據並返回結果集。 Android不提供用於插入或更新數據的類似本機實現。你所擁有的是從AsyncTaskLoader(與CursorLoader繼承的同一個類)擴展的選項。

另外,請記住,裝載機用於優化數據庫訪問,並且僅當它們完成任務時才提供結果給主線程,而不是在此之前(有一種像變通方法的發佈更新到UI線程,但是這打破了範例)。裝載機只關心完成他們的工作,並不想提供任何更新。

如果您只是想異步處理ContentProvider查詢,則可能需要考慮使用Android提供的AsyncQueryHandler類。