Слои, которые вы видите, объяснили здесь или в вашем приложении не вводят повторение кода, это может показаться так, но это делает ваше приложение модульным. Если ваше приложение масштабируется и вам нужно что-то повторно использовать или изменить, это будет намного проще.
И, кроме того, ViewModel
не делает вызовы асинхронными. То, что заставляет их работать, это LiveData
(при переносе вы возвращаете тип LiveData
в классе Дао).
ViewModel
служит для абстрагирования логики, не связанной с просмотром, от представления (действия или фрагмента) и позволяет данным пережить изменение конфигурации; кроме того, с ViewModel
вы избежите Бога Activity
, который обрабатывает все.
У вас есть несколько вариантов:
1) Вы можете использовать AsyncTask
, упомянутый @EarlOfEgo для выполнения insert
. И когда вы query
ваша база данных, просто оберните возвращаемый тип в LiveData
и все. Небольшой пример AsyncTask, взятый со страницы кодовой метки 8 :
private static class insertAsyncTask extends AsyncTask<Word, Void, Void> {
private WordDao mAsyncTaskDao;
insertAsyncTask(WordDao dao) {
mAsyncTaskDao = dao;
}
@Override
protected Void doInBackground(final Word... params) {
mAsyncTaskDao.insert(params[0]);
return null;
}
}
2) Если вам не нужно наблюдать за изменениями в вашей базе данных, тогда вы можете вообще избежать LiveData
и обрабатывать выполнение всех запросов и вставлять вручную в отдельный поток. Или другой вариант - получить только одно обновление от LiveData
и отменить регистрацию слушателя (или я считаю, что есть реализация LiveData
, которая получает только одно обновление).
3) Или вы можете просто .allowMainThreadQueries()