Android: является ли экземпляр ContentResolver потокобезопасным?

Мы все знаем, что запросы ContentResolver не должны выполняться в потоке пользовательского интерфейса, но, что удивительно, я не могу найти информацию о потокобезопасности класса ContentResolver в официальной документации.

Я знаю, как написать потокобезопасный ContentProvider, и я знаю, что SQLite является потокобезопасным по умолчанию (в нем реализован механизм внутренней блокировки).

Но безопасно ли использовать один экземпляр ContentResolver из нескольких потоков (например, два потока параллельно вызывают insert() или query() для одного и того же объекта)?


person Vasiliy    schedule 31.12.2016    source источник
comment
Я думаю, вы, должно быть, продвинулись дальше, но для людей, которые приземляются здесь, все зависит от базового резервного хранилища, наткнулись на эту замечательную статью на том же androiddesignpatterns.com/2012/10/   -  person humblerookie    schedule 15.03.2017
comment
@humblerookie, статья верна - SQLite реализует внутреннюю блокировку, поэтому реализации ContentProvider, поддерживаемые SQLite, являются потокобезопасными. Однако мой вопрос касается ContentResolver, а не ContentProvider - являются ли объекты ContentResolver, возвращаемые вызовами getContentResolver(), потокобезопасными. Хотя эти вопросы кажутся похожими, на самом деле это два совершенно разных вопроса.   -  person Vasiliy    schedule 15.03.2017
comment
Извиняюсь за невежество :/ . Однако просто решил взглянуть на объект распознавателя контента, созданный android. Похоже, это экземпляр ApplicationContentResolver android.googlesource.com/platform/frameworks/base/+/56a2301/ Как можно заметить, этот класс не поддерживает переменные состояния. Похоже, объект-преобразователь действительно является потокобезопасным.   -  person humblerookie    schedule 15.03.2017
comment
@humblerookie, если вы уже исследовали источник, почему бы не опубликовать свои выводы в качестве ответа?   -  person Vasiliy    schedule 15.03.2017
comment
Конечно. Сделаю   -  person humblerookie    schedule 15.03.2017


Ответы (2)


Немного покопавшись в исходном коде, мы находим экземпляр ContentResolver, созданный Android для приложения, являющегося экземпляром ApplicationContentResolver, находящийся внутри ContentImpl.

Как видно из приведенного ниже фрагмента и источника 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);
        }
    ....

Это обязательно подразумевало бы, что его потокобезопасность.

person humblerookie    schedule 15.03.2017

Это зависит от вашего кода, если вы реализуете свой contentResolver в безопасном единственном экземпляре, который может быть безопасным, если вы не добавили блокировку, он не будет потокобезопасным.

person larrysea    schedule 31.12.2016