当前位置: 首页 > 知识库问答 >
问题:

在多活动中用EventBus替换LiveData

司马宏茂
2023-03-14

目前我的项目使用EventBus发布事件,我正在尝试用EventBus替换LiveData。理论上,它们的工作原理类似。我一开始迁移时没有任何痛苦。但出现了一种情况,我不知道如何应对。

这是一个场景。

发射活动-

目前我们使用EventBus在Launchactive和人鱼信息活动中订阅用户信息事件

启动ctivity.java

public class LaunchActivity{
     @Subscribe(threadMode = ThreadMode.MAIN)
     public void onEvent(UserInfoEvent event){

     }
}

人物信息ctivity.java

public class PersonInfoActivity{
     @Subscribe(threadMode = ThreadMode.MAIN)
     public void onEvent(UserInfoEvent event){

     }
}

更新信息活动。JAVA

public class UpdateInfoActivity{
     public void onSubmit(){
          EventBus.getDefault().post(new UserInfoEvent());
     }
}

问题是,我想用LiveData来代替这个场景

我做了什么?

我读过关于livedata Room使用单例的问题-数据库更新时LiveData观察者不触发,我想尝试使用相同的方式,但没有运气。当我开始活动时,事件每次都在onChanged()中触发

共有3个答案

蓝恩
2023-03-14

我根据教程创建了一个名为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,它可以在触发事件后使用,防止从静态总线获取最后的数据
我在当前的项目中使用它,并且它在多个活动中都能很好地工作

舒俊雄
2023-03-14

我认为有一些关于LiveData的误解。你可以在这里看看

这可能对你有帮助。您还可以通过LiveData事件总线和LiveData检查事件总线的实现

希望能有帮助!!!

后阳炎
2023-03-14

你可以通过使用视图模型实现来实现它。比如,

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并启动活动,如,

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。

 类似资料:
  • 我真的不喜欢这样链接命令。有没有另一种方法在一个做?

  • 由于不推荐使用TabActivity,我需要找到一种方法来使用片段。在我知道它如何工作之前,我已经使用了碎片,但我需要一个指南来创建我的标签主机与碎片活动。我在互联网上找到了几个例子,它们都是关于将片段放入标签的容器中的。

  • 问题内容: 一个非常简单的小问题,但是我不太明白该怎么做。 我需要将’_’的每个实例替换为空格,并将’#’的每个实例替换为空/空。 我已经试过了: 我真的不喜欢这样的链接命令。还有另一种方法可以做到这一点吗? 问题答案: 使用OR运算符(): 您还可以使用字符类: Fiddle 如果您想用一件事替换哈希值,而用另一件事替换下划线,则只需要链接即可。但是,您可以添加一个原型: 但是为什么不连锁呢?我

  • 我正在搜索方法替换。它用于将值简单地传递给前一个片段,但问题是,我使用BackStackUtil进行导航,所以只有在返回前以某种方式清除堆栈时,才会在返回时调用方法 前一个片段包含项目列表,当下一个片段可以修改拾取的项目,而另一个片段可以做其他事情时,当这些事件中的每一个都传递给前一个片段时,这就是粘性事件链<应用程序结构不允许我在当前阶段应用协调器模式,而且我不想将包附加到保留在堆栈上的片段<我

  • 我将我的< code>MainActivity类重命名为< code>DataActivity,并用IntelliJ IDEA添加了一个新的主活动类。我将< code>AndroidManifest.xml文件更改为以下内容: 我从手机中卸载了该应用程序并删除了编译器缓存。在安装时,我得到以下异常: 启动应用:com.example.DataTest/com.example.DataTest.Da

  • 我将在一个Android应用程序中用替换模式。我有事件来提醒任何感兴趣的方面我的缓存中的数据更新单例。任何时候调用web服务,都将更新数据,并通过发布的事件向订阅者发出警报。 我在RxJava中使用设置了与此类似的内容。观察者从subject获得单个事件,但随后获得事件并取消订阅。这在UI第一次加载时起作用,但当需要刷新数据时,不会通知订阅者。如何告诉这些继续监听下一个事件?