Android: is ContentResolver instance thread-safe?

1.4k Views Asked by At

We all know that ContentResolver queries shouldn't be executed on UI thread, but, surprisingly, I can't find information about thread-safety of ContentResolver class in the official docs.

I know how to write thread-safe ContentProvider, and I know that SQLite is thread safe by default (it implements internal locking mechanism).

But, is it safe to use a single instance of ContentResolver from multiple threads (e.g. two treads call insert() or query() on the same object in parallel)?

2

There are 2 best solutions below

0
On

It depend on your code ,if you implment your contentResolver in the safe single instance that may be safe if you didn't add the lock ,it will not thread safe.

0
On

Digging a little into the source code we end up finding the ContentResolver instance created by android for an application being an instance of ApplicationContentResolver class residing inside ContentImpl.

As one can see from the snippet below and the source of ContextResolver there are no state variables.

 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);
        }
    ....

This would imply necessarily that its thread safe.