Android:ContentResolver实例是线程安全的吗?

时间:2016-12-31 09:53:36

标签: android multithreading thread-safety android-contentresolver

我们都知道不应该在UI线程上执行ContentResolver个查询,但令人惊讶的是,我无法在官方文档中找到有关ContentResolver类的线程安全性的信息。

我知道如何编写线程安全的ContentProvider,我知道SQLite默认是线程安全的(它实现了内部锁定机制)。

但是,从多个线程中使用ContentResolver的单个实例是否安全(例如,并行地在同一个对象上调用insert()query()两个)?

2 个答案:

答案 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,如果你没有添加锁可能是安全的,它将不会线程安全。