我们都知道不应该在UI线程上执行ContentResolver
个查询,但令人惊讶的是,我无法在官方文档中找到有关ContentResolver
类的线程安全性的信息。
我知道如何编写线程安全的ContentProvider
,我知道SQLite
默认是线程安全的(它实现了内部锁定机制)。
但是,从多个线程中使用ContentResolver
的单个实例是否安全(例如,并行地在同一个对象上调用insert()
或query()
两个)?
答案 0 :(得分:1)
在源代码中挖掘一下,我们最终找到了android为一个应用程序创建的ContentResolver实例。
驻留在ContentImpl
内的ApplicationContentResolver
课程。
从下面的代码片段和ContextResolver的来源可以看出,没有状态变量。
private static final class ApplicationContentResolver extends ContentResolver {
private final ActivityThread mMainThread;
private final UserHandle mUser;
public ApplicationContentResolver(
Context context, ActivityThread mainThread, UserHandle user) {
super(context);
mMainThread = Preconditions.checkNotNull(mainThread);
mUser = Preconditions.checkNotNull(user);
}
....
这意味着它的线程安全。
答案 1 :(得分:-1)
这取决于你的代码,如果你在安全的单个实例中实现你的contentResolver,如果你没有添加锁可能是安全的,它将不会线程安全。