Да, вы можете сделать это, и это действительно рекомендуемый способ.Для этого, я думаю, вам следует использовать два других компонента архитектуры, которые были представлены в Android Jetpack, не только Room
база данных: ViewModel и LiveData , но ине является обязательным
Важно добавить в приложение дополнительный слой с именем Repository
:
Репозиторий Модули обрабатывают операции с данными.Они предоставляют чистый API, так что остальная часть приложения может легко получить эти данные.Они знают, откуда взять данные и какие вызовы API следует выполнять при обновлении данных.Вы можете рассматривать репозитории как посредники между различными источниками данных, такими как постоянные модели, веб-службы и кэши.
Таким образом, в принципе, предлагаемая архитектура для обработки этого будет выглядеть примерно так:
Имея это в виду, пример репозитория, который извлекает данные пользователя из веб-службы и сохраняет их в локальной базе данных комнат, будет выглядеть примерно так:
public class UserRepository {
private final Webservice webservice;
private final UserDao userDao;
private final Executor executor;
public UserRepository(Webservice webservice, UserDao userDao, Executor executor) {
this.webservice = webservice;
this.userDao = userDao;
this.executor = executor;
}
public LiveData<User> getUser(String userId) {
refreshUser(userId);
// Returns a LiveData object directly from the database.
return userDao.load(userId);
}
private void refreshUser(final String userId) {
// Runs in a background thread.
executor.execute(() -> {
// Check if user data was fetched recently.
boolean userExists = userDao.hasUser(FRESH_TIMEOUT);
if (!userExists) {
// Refreshes the data.
Response<User> response = webservice.getUser(userId).execute();
// Check for errors here.
// Updates the database. The LiveData object automatically
// refreshes, so we don't need to do anything else here.
userDao.save(response.body());
}
});
}
}
Затем ваша ViewModel получит Пользовательские данные в реальном времени, выполнив что-то вроде этого:
...
user = userRepo.getUser(userId);
...
И предоставит эти LiveData слою пользовательского интерфейса с помощью открытого метода:
...
public LiveData<User> getUser() {
return this.user;
}
...
Наконец, со своего уровня пользовательского интерфейса (действия или фрагмента) вы можете наблюдать LiveData в ViewModel и соответствующим образом адаптировать пользовательский интерфейс.
viewModel.getUser().observe(this, user -> {
// Update UI.
});
ДляБолее полное объяснение Я предлагаю вам взглянуть на:
- Руководство по архитектуре приложения на веб-сайте разработчиков Android.
- Этот проект GithubвесЭто базовый пример.
- Этот другой проект Github с более сложным примером.