LiveData. observe внутри observe. Как корректно отписываться?
Коллеги, Прошу помощи ибо новичок ;) Есть Android-приложение которое реализовано в архитектуре Single Activity и есть c десяток экранов (Fragment) Все экраны (Fragment) располагаются во вкладках TabLayout. И между ними можно свободно перемещаться и смотреть различные данные (характеристики авто, тех.обслуживание, страховка, расходы...) А так же изменять данные.
И есть так же боковое drawer-меню с выбором автомобилей.
Почти каждый Fragment слушает события из drawer-меню и в зависимости от выбранного элемента (автомобиля) обновляет данные из Room DataBase на экранах.
Т.е. мне нужно слушать одновременно два LiveData, один из drawer-меню который передаёт ID, а второй LiveData уже из Room DataBase. Мой типичный экран в коде выглядит вот так:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
maintainHistoryViewModel = new ViewModelProvider(requireActivity()).get(MaintainHistoryViewModel.class);
toolbarViewModel = new ViewModelProvider(requireActivity()).get(ToolbarViewModel.class);
return inflater.inflate(R.layout.fragment_workspace_maintain_history, container, false);
}
@Override
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
//Слушаем события из drawer-меню
LiveData<UserVehicle> selectedVehicleLive = toolbarViewModel.getSelectedUserVehicle();
selectedVehicleLive.observe(getViewLifecycleOwner(), selectedVehicleItem->{
int vehicleId = selectedVehicleItem.getUserVehicle().getId();
//Слушаем события из БД и ждём обновления на других экранах
LiveData<List<UserVehicleMaintain>> vehicleDataLive = maintainHistoryViewModel.getUserVehicleMaintainDataBase(vehicleId);
vehicleDataLive.observe(getViewLifecycleOwner(), userMaintainState->{
//Действия в UI
});
});
}
Как вы понимаете, любое событие из drawer-меню подпишем меня на новый LiveData.
LiveData<List<UserVehicleMaintain>> vehicleDataLive = maintainHistoryViewModel.getUserVehicleMaintainDataBase(vehicleId);
А старый наблюдатель ведь никуда не денется. И по прежнему будет слушать getUserVehicleMaintainDataBase со своим vehicleId. Хотя он и не нужен во все) Подскажите пожалуйста как тут быть? Как мне отписываться правильно или как мне изменить архитектуру, что ли?)