当前,我的项目使用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()
每次都会触发该事件
答案 0 :(得分:3)
TLDR:您必须将项目分成单独的层。
您可以以我的小项目为例:
主要目标(在合理范围内):像往常一样,代码模块化,可伸缩性,易于维护,易于测试等……
这是为小型项目实施最小草案的尝试。单个开发人员可以理解。而且...该方案有效。
使用:
层:
答案 1 :(得分:1)
答案 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)
您可以在单例类中声明和初始化实时数据实例。并且可以在所有三个不同的活动中使用相同的实例。