gpt4 book ai didi

android - Room LiveData 观察器 (onChange) 触发多次但仅针对 INSERT

转载 作者:行者123 更新时间:2023-11-29 23:54:10 24 4
gpt4 key购买 nike

我注意到 android Room 库有一些奇怪的行为(至少对我来说看起来很奇怪)。

虽然还有其他帖子有类似问题,但(我能找到的)没有一个与此完全相同。

我的问题是,当我观察一个 LiveData 对象时,我的观察者的 onChange() 方法被多次调用,但仅用于 INSERT 操作。对于我插入的每个对象,该方法将被触发一次(即,如果我插入一个包含 N 个对象的列表,它将被触发 N 次),而对于其他操作(例如 DELETE),无论列表的大小如何,它都会被触发一次我正在删除。

我的 DAO 中有以下查询:

@query("select * from myTable")
LiveData<myEntity> getAll();

@insert
void insert(List<myEntity> entities);

@delete
void delete(List<myEntity> entities);

我正在观察 getAll() 方法,我肯定会调用 delete()insert() 方法一次 - 某事像这样:

public void insertAll(List<myEntity> items)
{
myDao.insert(items);
}

public void deleteAll(List<myEntity> items)
{
myDao.delete(items);
}

由于在我的 onChange() 方法中我更新了一个用户可见的 RecyclerView 适配器,这是一个问题,因为我得到了很多重复项并且我还在那里做了一些其他的事情,这些事情实际上应该只在每次表更改时执行一次,但它们会执行很多次(正如我所说的,每插入一个项目一次)。

我已阅读这篇文章并尝试实现技巧 7,但问题仍然存在。 https://medium.com/google-developers/7-pro-tips-for-room-fbadea4bfbd1

这是设计使然并被认为是正常行为吗?我该怎么做才能让我的观察者只为每个 INSERT 操作触发一次(即使我同时插入多个对象)?

最佳答案

虽然我不完全理解它,但我找到了解决方案!

我的问题是我正在从 onNewIntent() 调用 observe() 并且我的调用看起来像这样:

 mViewModel.getAll().observe(this, new Observer<ArrayList<MyObject>>()...);

我从 onNewIntent() 调用这个的原因是这个 Activity 可以从我的应用程序的几乎任何地方打开,使用标志 BRING_TO_FRONT (或任何它叫的)所以 onCreate() 不能保证被调用所以我想我最好通过将它放在 onNewIntent() 中来确保调用观察者。我看了他们说的文档

If the given owner, observer tuple is already in the list, the call is ignored.

所以我以为我是安全的。由于某种原因我没有意识到的是,我实际上每次都在使用 new 关键字创建一个新的观察者。结合从 onNewIntent() 调用它会导致多个重复 观察者,从而导致 onChanged() 方法被多次触发(嗯,实际上它只被调用了一次,但每个观察者一次!)。

一旦我将 observe() 调用移至 onCreate(),问题就解决了,我得到了一次对 onChanged() 的调用即使我将多个项目插入到我的表中。

然而,这仍然没有解释 delete 方法如何只被调用一次用于多个...

关于android - Room LiveData 观察器 (onChange) 触发多次但仅针对 INSERT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50550074/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com