В настоящее время у меня есть приложение с ForegroundService для всех взаимодействий сервера/API и база данных Room для локального сохранения. Я пытался реализовать AndroidViewModel, чтобы помочь с сохранением данных и быстрым обновлением пользовательского интерфейса.
Однако, согласно документации, ViewModels не могут быть реализованы в Службах, поэтому далеко я использовал Службу для локального обновления информации и уведомления компонентов с помощью LocalBroadcasts (это то, что я хочу исключить с помощью ViewModels и Observers).
Мне нужно, чтобы служба работала, так как приложение должно продолжать работать в фоновом режиме (это критически важное приложение, а закрытие приложения означает, что пользователь не будет доступен для предоставления критически важных услуг) и периодически обновлять определенную информацию. (ближайшие запросы и т.д.).
Итак, чтобы задать основной вопрос -
- Как отделить службу от ViewModel, и если у службы есть последние синхронизированные данные с серверов, как обновить списки (изменяемых) LiveData в моей ViewModel?
- Эта статья и этот ответ на вопрос здесь, на SO говорит лучше отделить ViewModel от репозитория, пока это другой один дает пример включения базы данных Room внутри ViewModel. Какой вариант лучше?
Часть моего кода ViewModel выглядит следующим образом:
public class HouseCallViewModel extends AndroidViewModel {
private String TAG = HouseCallViewModel.class.getSimpleName();
private MutableLiveData<List<HouseCall>> housecallList;
private MutableLiveData<List<HouseCall>> openHousecalls, confirmedHousecalls, closedHousecalls, missedHousecalls, userCancelledHousecalls, respCancelledHousecalls;
private MutableLiveData<List<Incident>> incidentList, openIncidents;
private MutableLiveData<List<Incident>> closedIncidents, usercancelIncidents, respcancelIncidents;
RevivDatabase database;
Context context;
public HouseCallViewModel(Application application) {
super(application);
// DANGER WILL ROBINSON
context = application.getApplicationContext();
database = Room.databaseBuilder(this.getApplication(),
RevivDatabase.class, application.getResources().getString(R.string.database)).build();
}
public LiveData<List<HouseCall>> getHousecallList() {
if (housecallList == null) {
housecallList = new MutableLiveData<>();
loadHousecalls(); // need to call API and sync
}
return housecallList;
}
public LiveData<List<HouseCall>> getIncidentList() {
if (incidentList == null) {
incidentList = new MutableLiveData<>();
loadIncidents(); // need to call API and sync
}
return housecallList;
}
// other constructors, getters and setters here, and functions to update the data
}