2011-09-06 82 views
2

我應該在contentprovider的函數上使用ReadWriteLock嗎?Android contentprovider鎖定

在contentprovider的查詢中,我執行getReadableDatabase,然後檢查它是否打開並執行查詢。 但有時它會在DatabaseIsClosed exeption上崩潰。 這可能是一個其他進程做了一個插入,它執行一個getWritebleDatabase關閉第一個。

我正在使用一個應用程序和服務誰不斷地查詢和插入contentprovider。因此,內容提供者似乎不是線程安全的。

它可以幫助使功能同步?

謝謝!

回答

1

在contentprovider的查詢中,我執行getReadableDatabase,然後檢查它是否打開並執行查詢。但有時它會在DatabaseIsClosed exeption上崩潰。這可能是其他進程做了一個插入,它執行了一個getWritebleDatabase關閉第一個的插入。

您應該保持數據庫在ContentProvider,AFAIK的有效期內保持打開狀態。

所以看起來contentprovider不是線程安全的。

AFAIK,ContentProvider只在一個線程上被調用過。

ContentProvider大多是立面,不提供任何內在的線程安全性。

+0

在[AlarmProvider]裏面(http://www.grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android-apps/2.2.1_r1/com/android/alarmclock /AlarmProvider.java#AlarmProvider),他們也會在每個插入/查詢/更新中獲得一個新的可讀/可寫數據庫。像我一樣。但他們不關閉收到的數據庫,這是什麼? 這也應該是不穩定的,但我想我們經常查詢並插入AlarmProvider。 –

+0

@CommonsWare你可能想要更新你的答案......按照[文檔](http://developer.android.com/reference/android/content/ContentProvider),可以一次從多個線程調用「ContentProvider」。 HTML)。公平地說,我認爲去年九月這種情況並不明顯。 :) –

+0

@AlexLockwood:是的,爲什麼想要使用「ContentProvider」的早期參數之一是它提供的線程安全性......事實並非如此。感謝您指出錯誤的答案! – CommonsWare