LiveData 观察者未调用

2024-02-19

我有一个活动,TabBarActivity承载一个片段,EquipmentRecyclerViewFragment。片段收到 LiveData 回调,但 Activity 没有(在调试模式下使用断点进行证明)。奇怪的是,如果我调用 ViewModel 的 Activity 回调就会触发initData方法。以下是上述组件的相关部分:

TabBar活动

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    initVM()
    setContentView(R.layout.activity_nav)
    val equipmentRecyclerViewFragment = EquipmentRecyclerViewFragment()
    supportFragmentManager
            .beginTransaction()
            .replace(R.id.frameLayout, equipmentRecyclerViewFragment, equipmentRecyclerViewFragment.TAG)
            .commit()
    navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)

}

var eVM : EquipmentViewModel? = null
private fun initVM() {
    eVM = ViewModelProviders.of(this).get(EquipmentViewModel::class.java)
    eVM?.let { lifecycle.addObserver(it) } //Add ViewModel as an observer of this fragment's lifecycle
    eVM?.equipment?.observe(this, loadingObserver)//        eVM?.initData() //TODO: Not calling this causes Activity to never receive the observed ∆
}
val loadingObserver = Observer<List<Gun>> { equipment ->
    ...}

EquipmentRecyclerViewFragment

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    columnCount = 2
    initVM()
}

//MARK: ViewModel Methods
var eVM : EquipmentViewModel? = null
private fun initVM() {
    eVM = ViewModelProviders.of(this).get(EquipmentViewModel::class.java)
    eVM?.let { lifecycle.addObserver(it) } //Add ViewModel as an observer of this fragment's lifecycle
    eVM?.equipment?.observe(this, equipmentObserver)
    eVM?.initData()
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val view = inflater.inflate(R.layout.fragment_equipment_list, container, false)
    if (view is RecyclerView) { // Set the adapter
        val context = view.getContext()
        view.layoutManager = GridLayoutManager(context, columnCount)
        view.adapter = adapter
    }
    return view
}

设备视图模型

class EquipmentViewModel(application: Application) : AndroidViewModel(application), LifecycleObserver {
var equipment = MutableLiveData<List<Gun>>()
var isLoading = MutableLiveData<Boolean>()

fun initData() {
    isLoading.setValue(true)
    thread { Thread.sleep(5000) //Simulates async network call
        var gunList = ArrayList<Gun>()
        for (i in 0..100){
            gunList.add(Gun("Gun "+i.toString()))
        }
        equipment.postValue(gunList)
        isLoading.postValue(false)
    }
}

最终目标是让活动只是观察isLoadingMutableLiveData 布尔值,但由于这不起作用,我更改了活动以仅观察设备 LiveData,以最大限度地减少起作用的变量数量。


获得相同的参考ViewModel你的Activity你需要通过同样的Activity例如,你应该使用ViewModelProviders.of(getActivity)。当你通过时this作为参数,您收到的实例ViewModel与你相关的Fragment.

有两个重载方法:

ViewModelProvider.of(Fragment fragment)

ViewModelProvider.of(FragmentActivity activity)

欲了解更多信息在片段之间共享数据 https://developer.android.com/topic/libraries/architecture/viewmodel.html#sharing

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LiveData 观察者未调用 的相关文章

随机推荐

  • 流水线 sed 调用和多个 sed 表达式之间的效率有区别吗?

    我有一个关于 bash 中 sed 效率的问题 我有一系列管道化的 sed 语句 例如 var1 Some string of text var2 echo var1 sed s pattern1 replacement1 g sed s
  • 如何在运行时监控某些java方法分配的内存

    我正在创建一个 java 程序 其中我的类假设 A 有一些预定义的行为 但用户可以覆盖我的类来改变其行为 因此 我的脚本将检查是否存在某个子类 而不是我将其称为它的行为 但是如果他在代码中编写了一些阻塞代码或内存泄漏怎么办 这可能会损害我的
  • 在领域迁移期间创建领域对象

    您能够在迁移期间创建领域对象吗 我想要提取现有领域对象的一部分并使用该数据创建一个新对象 但迁移总是挂起 这是我的迁移代码 private class var migrationBlock MigrationBlock return mig
  • 是否可以从 Chromium 扩展中禁用 Flash 插件?

    我知道可以手动禁用 Chromium 中的 Flash 插件 只需转到 chrome plugins 找到 Adobe Flash Player 并将其禁用即可 我想知道是否可以使用 JavaScript 代码或扩展中的任何客户端脚本语言来
  • ASP.NET 图片上传并调整大小

    我有一个 aspx 页面 它将图像从客户端电脑上传到服务器硬盘 但现在我需要更改我的程序 以便我可以在上传时调整图像大小 有人对此有任何想法吗 我无法使用输入文件服务器控件找到此类属性 方法 有人指导我吗 将文件保存到服务器后 您可以使用这
  • Laravel 中的关系和 Blade

    我有 3 个表 如下所述 Table 1 user id username password Name Age Table 2 tasks id task name description Table 3 logs id user id t
  • 重写继承的抽象类中的抽象方法

    好吧 基本上我有以下问题 我试图让一个抽象类继承另一个具有抽象方法的抽象类 但我不想在它们中的任何一个中实现抽象方法 因为第三个类继承了两个类其中 public abstract class Command public abstract
  • 如何分析本机 JNI 库

    如何分析用 C 编写的 Java 本机接口库 我了解常用的 C 分析器 但我的问题是如何分析whole设置包括对 JVM 方法的调用 这可能会减慢程序速度 经过对这里提出的一些方法的一些研究和测试后 我最终使用了sprof 基本上我遵循了可
  • dotnetcore 中的服务结构客户端身份验证 UserPasswordCredential 不起作用

    我正在 aspnetcore dotnetcore2 0 应用程序中构建一个小型服务结构维护 但现在无法识别 UserPasswordCredential 类 从here https github com AzureAD azure act
  • 如何检测设备上是否存在Android Market?

    有些Android设备没有Android Market 例如韩国等 是否可以在运行时检测Android Market的存在 我知道我可以先尝试打开一个市场 uri 看看是否有抛出任何异常 但我认为这不是一个明智的做法 我知道我可以尝试打开一
  • Unicode 代码页 1200 到底是什么?

    在研究一些本地化选项时 我偶然发现它是 Visual Studio 中的保存选项 Unicode 代码页 1200 到底是什么 微软文档页面代码页标识符 https learn microsoft com en us windows win
  • 使用 printf 格式在 C 中打印等宽列

    我想在 C 中使用 printf 打印列 我编写了以下代码 include
  • didReceiveRemoteNotification:fetchCompletionHandler:从图标打开与推送通知

    我正在尝试实现后台推送通知处理 但在确定用户是否从发送的推送通知打开应用程序而不是从图标打开应用程序时遇到问题 void application UIApplication application didReceiveRemoteNotif
  • 在 JavaScript 上添加/删除监听器(垃圾收集器)

    我有一个关于添加 删除 DOM 对象的侦听器的快速问题 我想问垃圾收集器是否能够在从页面中删除元素时收集内存 示例 一个 ul 带有几个孩子列表的标签 li var ul document getElementById someParent
  • 带有模板参数的模板中的默认值 (C++)

    假设我有一个模板 称为 ExampleTemplate 它接受两个参数 容器类型 例如列表 向量 和包含类型 例如 float bool 等 由于容器实际上是模板 因此该模板有一个模板参数 这就是我必须写的 include
  • python 异常。UnicodeDecodeError: 'ascii' 编解码器无法解码字节 0xa7

    我正在将 scrapy 与 python 结合使用 并且在 python item pipline 中有此代码 def process item self item spider import pdb pdb set trace ID st
  • Django 表单 - 验证错误后重新加载时变量类型发生变化

    我花了一些时间 但无法找出以下行为的确切原因 我有一个 Django 表单 在模板中我试图查看列表中是否存在整数 然后用它做一些事情 if pk in form area value form area value is a list li
  • 有没有办法设置X轴的背景颜色

    我检查了文档 我能找到的只是设置笔划 但我需要整个 x 轴背景不仅仅是字体颜色 Renaldo Balaj 好吧 你可以像这里一样向你的图表添加一个 svg 元素 https codesandbox io s highlight zomm
  • 如何比较两个日期[重复]

    这个问题在这里已经有答案了 我有一个带有 PHP 前端的 MySQL 数据库 在我的记录中 我有一个直接从数据库访问的发布日期和到期日期 我需要做的是检查并查看是否有任何记录的过期日期与发布日期相符 就像是 你可以这样做 posted da
  • LiveData 观察者未调用

    我有一个活动 TabBarActivity承载一个片段 EquipmentRecyclerViewFragment 片段收到 LiveData 回调 但 Activity 没有 在调试模式下使用断点进行证明 奇怪的是 如果我调用 ViewM