Замените LiveData на EventBus в мультиактивности

В настоящее время мой проект использует 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(), когда я запускал действие

Могу я спросить, почему вы решили заменить EventBus на LiveData?

FelisManulus 23.11.2019 01:40

@FelisManulus Это его случай / необходимость, и нам не следует беспокоиться об этом - это глупый вопрос. Вы пытаетесь отстаивать использование LiveData? Тот факт, что Google продвигает его, и большинство разработчиков и компаний используют его, не означает, что его следует использовать.

FEBRYAN ASA PERDANA 19.05.2021 01:56
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
2
4 007
4

Ответы 4

Я думаю, что в отношении LiveData есть какое-то неверное толкование. Можете посмотреть здесь

Это может вам помочь. Также вы можете проверить это на предмет реализации шины событий с помощью LiveData шина событий с liveData

Надеюсь, поможет!!!

На самом деле я читал эту статью об альтернативах, но думаю, что это вызовет путаницу, если я буду использовать «LiveData» и «EventBus» одновременно. Есть еще предложения SingleEvent, EventWrapper от разработчика Google с использованием LiveData. Так что я думаю, наконец, LiveData заменит EventBus. Но одна вещь, в которой я застрял, это то, что новый наблюдатель, прикрепленный к новому Activity / Fragment, продолжает получать последние данные из статического класса шины, который я не хочу, а также не совпадает с поведением EventBus.

Long Ranger 16.07.2018 11:44

Добиться этого можно с помощью реализации 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?

Mohammad Hosein Kalantarian 26.06.2021 14:10

Я создал библиотеку под названием 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, и вам не нужно заботиться об активности или жизненном цикле фрагмента.

Вы можете объявить и инициализировать экземпляр живых данных в одноэлементном классе. И может использовать один и тот же экземпляр во всех трех разных действиях.

Другие вопросы по теме