В настоящее время мой проект использует EventBus для публикации событий, и я пытаюсь заменить LiveData на EventBus. Теоретически они работают аналогично. Вначале я мигрировал безболезненно. Но возникает сценарий, в котором я понятия не имею, как с этим бороться.
А вот сценарий.
LaunchActivity -> PersonInfoActivity -> UpdateInfoActivity
В настоящее время мы используем EventBus для подписки на UserInfoEvent в LaunchActivity и PersonInfoActivity.
LaunchActivity.java
public class LaunchActivity{
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(UserInfoEvent event){
}
}
PersonInfoActivity.java
public class PersonInfoActivity{
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(UserInfoEvent event){
}
}
UpdateInfoActivity.java
public class UpdateInfoActivity{
public void onSubmit(){
EventBus.getDefault().post(new UserInfoEvent());
}
}
И вопрос в том, что я хочу использовать LiveData для замены этого сценария.
Что я наделал?
Я прочитал вопрос об использовании синглтона с liveata Комната - обозреватель LiveData не запускается при обновлении базы данных, я хочу попробовать использовать тот же способ, но безуспешно. Событие запускается каждый раз в onChanged(), когда я запускал действие
@FelisManulus Это его случай / необходимость, и нам не следует беспокоиться об этом - это глупый вопрос. Вы пытаетесь отстаивать использование LiveData? Тот факт, что Google продвигает его, и большинство разработчиков и компаний используют его, не означает, что его следует использовать.




Я думаю, что в отношении LiveData есть какое-то неверное толкование. Можете посмотреть здесь
Это может вам помочь. Также вы можете проверить это на предмет реализации шины событий с помощью LiveData шина событий с liveData
Надеюсь, поможет!!!
На самом деле я читал эту статью об альтернативах, но думаю, что это вызовет путаницу, если я буду использовать «LiveData» и «EventBus» одновременно. Есть еще предложения SingleEvent, EventWrapper от разработчика Google с использованием LiveData. Так что я думаю, наконец, LiveData заменит EventBus. Но одна вещь, в которой я застрял, это то, что новый наблюдатель, прикрепленный к новому Activity / Fragment, продолжает получать последние данные из статического класса шины, который я не хочу, а также не совпадает с поведением EventBus.
Добиться этого можно с помощью реализации viewModel. Нравиться,
public class UserViewModel extends AndroidViewModel {
private UserRepository userRepository;
private LiveData<List<UserData>> getUser;
public UserViewModel(@NonNull Application application) {
super(application);
userRepository = new UserRepository(application);
getUser= userRepository.getUser();
}
public LiveData<List<UserData>> getUser() {
return getUser;
}
}
После создания этого класса обновите свои PersonalInfoActivity и LaunchActivity, например,
private UserViewModel userViewModel;
userViewModel.getUser().observe(this, new Observer<List<UserData>>() {
@Override
public void onChanged(@Nullable final List<UserData> user) {
//write code to set data of user to show using list of user
}
});
Пожалуйста, оставьте commnet, если вы найдете какой-либо вопрос по этому поводу.
Как присвоить значение userViewModel?
Я создал библиотеку под названием LivedataBus из руководство Вы можете использовать это так:
//Subscribe
LiveDataBus.subscribe("event_name", this, Observer {
it.runAndConsume {
Toast.makeText(this, "Hello ${it.value}", Toast.LENGTH_LONG).show()
}
})
//Publish
val obj = SomeEvent()
LiveDataBus.publish("event_name", ConsumableEvent(value = obj))
Магия в том, что я использовал ConsumableEvent, который можно использовать после события срабатывания, чтобы предотвратить получение последних данных из статической шины.
Я использую его в своем текущем проекте, и он хорошо работает с несколькими действиями и фрагментами.
Преимущество этой библиотеки в том, что она работает с Livedata, и вам не нужно заботиться об активности или жизненном цикле фрагмента.
Вы можете объявить и инициализировать экземпляр живых данных в одноэлементном классе. И может использовать один и тот же экземпляр во всех трех разных действиях.
Могу я спросить, почему вы решили заменить EventBus на LiveData?