在多个活动中将LiveData替换为EventBus

时间:2018-07-07 16:20:46

标签: java android android-architecture-components android-livedata greenrobot-eventbus

当前,我的项目使用EventBus来发布事件,而我正在尝试用EventBus替换LiveData。从理论上讲,它们的工作类似。我一开始就毫不费力地迁移了。但这是我不知道如何处理的情况。

这是场景。

LaunchActivity-> PersonInfoActivity-> UpdateInfoActivity

当前,我们使用EventBus在LaunchActivity和PersonInfoActivity中订阅UserInfoEvent

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代替这种情况

我做了什么?

我已经阅读了有关使用livedata Room - LiveData observer does not trigger when database is updated的单例使用的问题,我想尝试使用相同的方法,但是没有运气。每当我启动活动时,onChanged()每次都会触发该事件

5 个答案:

答案 0 :(得分:3)

TLDR:您必须将项目分成单独的层。

您可以以我的小项目为例:

主要目标(在合理范围内):像往常一样,代码模块化,可伸缩性,易于维护,易于测试等……

这是为小型项目实施最小草案的尝试。单个开发人员可以理解。而且...该方案有效。

使用:

  • Retrofit2
  • RxJava2
  • 房间(Android体系结构组件)
  • ViewModel(Android体系结构组件)

层:

  • UI(活动,片段)
  • ViewModel-UI状态持有者,UI Rx订阅持有者
  • 交互者/用例/业务规则
  • 存储库-所有数据源的外观
  • 可观察的数据源:远程-REST API,本地-数据库(真相源)

enter image description here

enter image description here

答案 1 :(得分:1)

我认为对LiveData有一些误解。您可以看看Boost.Python

这可能会对您有所帮助。您还可以使用LiveData here

检查此事件总线的实现

希望有帮助!!!

答案 2 :(得分:0)

您可以使用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。

答案 3 :(得分:0)

我从LivedataBus创建了一个名为tutorial的库 您可以像这样使用它:

 //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上运行,而您无需关心活动或片段生命周期。

答案 4 :(得分:0)

您可以在单例类中声明和初始化实时数据实例。并且可以在所有三个不同的活动中使用相同的实例。