Android Room + AsyncTask

Моя команда разработала новое приложение для Android, в котором широко используется Room.

Я не уверен, правильно ли мы используем AsyncTask.

Нам пришлось обернуть все вызовы вставки / обновления / удаления в AsyncTasks, что привело к огромному количеству AsyncTasks. Все вызовы в комнату поступают из фоновых служб. Нет прямого доступа к Room из активностей или фрагментов - они получают все через LiveData.

Пример вызова для вставки строки:

AsyncTask.execute(() -> myModelDAO.insertInstance(myModel));

При этом в DAO:

@Insert
void insertInstance(MyModel model);

person NickB    schedule 29.09.2017    source источник


Ответы (4)


Чтобы завершить ответ @CommonsWare, вы можете использовать класс Executor для выполнять запросы Room в фоновом потоке.

Executor myExecutor = Executors.newSingleThreadExecutor();
myExecutor.execute(() -> {
   myModelDAO.insertInstance(myModel)
});

Google показал пример в своем руководстве по компонентам архитектуры Android.

person Phil    schedule 13.03.2018
comment
это работает эквивалентно AsyncTask? в чем преимущество его использования перед asynctask, вы можете объяснить? - person Jay Dangar; 25.08.2018

Все звонки в комнату поступают из фоновых служб.

Тогда вам не следует использовать AsyncTask. AsyncTask только для случаев, когда вы хотите выполнить работу в основном потоке приложения после выполнения фоновой работы, а это почти никогда не бывает со службой. Используйте что-нибудь еще (поток, пул потоков, RxJava и т. Д.). Это не имеет ничего общего с Room.

person CommonsWare    schedule 29.09.2017
comment
Запрос на вставку может заблокировать поток пользовательского интерфейса Android, и это не разрешено. Нам нужно вставить вставку в фоновый async или RX - person Munish Thakur; 17.11.2017
comment
@MunishThakur: Да, но есть много способов выполнения асинхронной работы, не требующей AsyncTask. - person CommonsWare; 17.11.2017
comment
Правильно, с поддержкой lamba и kotlin все короче. Задача Async также состоит из одного лайнера :-) AsyncTask.execute ({// code to Exceute}) - person Munish Thakur; 18.11.2017

AsyncTask.execute(() -> myModelDAO.insertInstance(myModel));

Выглядит неправильно, вы можете использовать Simple Thread / Threadpool / Schedulers и т. Д.

person Dipendra Sharma    schedule 10.12.2017

Вы можете использовать обратный вызов, например Consumer<List<object>>callback. Например:

roomManger.getAllUsertById(user.getId(), this, new Consumer<List<User>>() {
            @Override
            public void accept(List<Product> listOfUser) {
                users.addAll(listOfUser)}
person Shlomo Kashy    schedule 24.02.2018