如何取消订阅实时数据android

Posted

技术标签:

【中文标题】如何取消订阅实时数据android【英文标题】:how to unsubscribing from live data android 【发布时间】:2021-04-08 08:19:18 【问题描述】:

我有片段ProductsFragment,它在回收站视图中显示产品列表。

当在回收站视图上单击一个项目时,它会将我带到AddProductFragment,它会显示所单击项目的产品详细信息。这是我使用 SharedProductViewModel 完成的,它有一个选定的可变实时数据

我面临的问题是ProductsFragment 我有一个浮动操作按钮,我用它导航到AddProductFragment 以添加新产品。但它会显示列表中先前单击的产品详细信息

SharedProductViewModel

class SharedProductViewModel : ViewModel() 
    val selected = MutableLiveData<Product>()

    fun select(product: Product) 
        selected.value = product
    

ProductsFragment - 当项目被点击时

private val model: SharedProductViewModel by activityViewModels()

   private fun listItemClicked(product: Product) 
        Toast.makeText(context, "Selected name is $product.name", Toast.LENGTH_LONG).show()
        model.select(product)
        navController.navigate(R.id.addProductFragment)
    

AddProductFragment - 单击添加新产品图标时显示先前单击的产品详细信息

注意:观察者总是被触发,无论是点击项目还是加号按钮来添加新产品

  private val model: SharedProductViewModel by activityViewModels()

   model.selected.observe(viewLifecycleOwner, Observer<Product>  item ->
            Toast.makeText(context, "item clicked and received" + item.name, Toast.LENGTH_LONG).show()
            addProductViewModel.updateProductDetails(item)
        )

我不希望它在单击添加新产品时显示之前单击的产品详细信息。

请问我该怎么做

谢谢 回复

【问题讨论】:

添加一个bundle到fragment事务,告诉下一个fragment它应该显示一个新产品还是在视图模型中选择一个。 【参考方案1】:

Selected 和 New Product 本质上是两个不同的模型,所以我建议你保留两个不同的LiveData 对象;每个人一个,像这样:

val selectedProduct = MutableLiveData<Product>()

&

val newProduct = MutableLiveData<Product>()

只需记住每次成功添加新产品时将newProduct 重置为null。这将确保您没有显示旧数据。

【讨论】:

您好,我没有新产品的新型号 您不需要一个新类型,只需要一个 Product 类型的新对象。如何创建该对象取决于您自己,取决于您的代码结构。【参考方案2】:

向片段事务添加一个捆绑包,以告知下一个片段是否应该显示新产品或视图模型中选定的产品。

在实例化 Fragment 时,在将它传递给事务以显示它之前添加一个捆绑包:

val fragment = AddProductFragment().apply 
    arguments = bundleOf("isNewProduct" to true)

然后在 Fragment 中,你可以创建一个读取值的属性。使用此布尔值来确定您是否观察到当前的产品实时数据。

private val isNewProduct: Boolean get() = arguments?.getBoolean("isNewProduct") ?: false

【讨论】:

如果您使用的是导航组件,则可以使用导航参数来代替。

以上是关于如何取消订阅实时数据android的主要内容,如果未能解决你的问题,请参考以下文章

Android GB28181接入端实时位置订阅和上报之-如何获取当前经纬度

使用带有 React 和 Apollo 的 graphql 订阅制作实时应用程序

Apollo GraphQL 取消订阅似乎坏了

离子生命周期取消/订阅 Firebase 数据库流(使用异步管道)

实时数据订阅与分发系统概述

实时数据订阅与分发系统概述