2011-09-06 85 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