我所看到的有关如何制作 ContentProvider 的示例都使用了UriMatcher#match(Uri)insertqueryupdate方法中的 delete 方法来轻松处理内容提供​​商响应的所有URI模式(例如http://developer.android.com/resources/samples/NotePad/src/com/example/android/notepad/NotePadProvider.html)。直到今天,这对我来说似乎还可以,当时我在ContentProvider API文档中注意到insertqueryupdatedelete“可以[全部]从多个线程中调用”。此外,UriMatcher文档未提及线程安全性或match是否可重入。

我是否需要担心在matchstaticUriMatcherinsert的实现中使用的,在query的共享update实例上同步对delete的调用?

最佳答案

仔细观察the source of UriMatcher ,似乎多个线程可以同时调用match方法,因为match的实现仅访问每个线程变量uri(参数),共享的String s和ArrayList<UriMatcher>的元素(通过 ArrayList#get(int) ,它是线程-安全的)。
addURI而不是线程安全的,因为它在结构上修改了ArrayList。它与ArrayList读取的match相同,因此在其他线程可能正在调用addURI时无法调用match

10-08 16:48