【问题标题】:I have a problem with Livedata observer called multiple time我对多次调用的 Livedata 观察者有疑问
【发布时间】:2020-03-29 19:06:53
【问题描述】:

这是我的 CartProductItemDao。

    @Dao
public interface CartProductItemDao {

    @Query("select * from CartProductItem where product__category__id = :id")
    LiveData<List<CartProductItem>> getCartProductItemList(int id);

    @Query("select * from CartProductItem where product__id in (:items)")
    LiveData<List<CartProductItem>> getAllProductsSectionItem(ArrayList<Integer> items);

    @Query("Select * from CartProductItem  where product__fav_market_id =:id")
    LiveData<List<CartProductItem>> geAllCartProductItemList(int id);
}

这是我的 CartProductItemRepository。

    public class CartProductItemRepository {
    LiveData<List<CartProductItem>> cartProductItemList;
    CartProductItemDao cartProductItemDao;

    public CartProductItemRepository(Application application) {
        TreaderOnlineDatabase treaderOnlineDatabase=TreaderOnlineDatabase.getInstance(application);
        cartProductItemDao=treaderOnlineDatabase.cartProductItemDao();
    }

    public LiveData<List<CartProductItem>> getCartProductItemList(int cat_id) {
        cartProductItemList= cartProductItemDao.getCartProductItemList(cat_id);
        return cartProductItemList;
    }
}

这是我的 CartProductItemViewModel。

    public class CartProductItemViewModel extends AndroidViewModel {
    LiveData<List<CartProductItem>> cartProductItemList;
    LiveData<List<CartProductItem>> productSectionItemList;
    LiveData<List<CartProductItem>> allCartProductItem;
    CartProductItemRepository cartProductItemRepository;

    SharedPreferenceClass sharedPreferenceClass;

    public CartProductItemViewModel(@NonNull Application application) {
        super(application);
        cartProductItemRepository=new CartProductItemRepository(application);
        sharedPreferenceClass=new SharedPreferenceClass(getApplication());
        //cartProductItemList=cartProductItemRepository.getCartProductItemList();
    }

    public LiveData<List<CartProductItem>> getCartProductItemList(int id) {
        cartProductItemList=cartProductItemRepository.getCartProductItemList(id);
        return cartProductItemList;
    }
}

我从片段内部调用了 getCartProductItemList(cat_is) 这是代码

    @Override
public void recyclerViewOnClick2() {
    CartProductItemViewModel cartProductItemViewModel;
    cartProductItemViewModel=ViewModelProviders.of(this).get(CartProductItemViewModel.class);
    int x=sharedPreferenceClass.getSharedPreferenceCatId();
    cartProductItemViewModel.getCartProductItemList(x).observe(this, new Observer<List<CartProductItem>>() {
        @Override
        public void onChanged(List<CartProductItem> cartProductItems) {
            product_categoriesFragmentAdpter.setArrayList(cartProductItems, getContext());
        }
    });
}

当我对表进行更新或删除或插入此观察者多次调用时出现的问题。

【问题讨论】:

  • 仅供参考,您可以使用 markdown 样式 ``` 来标记代码块的开始和结束。
  • 你从哪里调用这个方法:recyclerViewOnClick2()?/确保你没有多次触发它,因为你有这个对象本地:CartProductItemViewModel cartProductItemViewModel;
  • 当用户点击 RecyclerView 的项目时,我从 RecyclerViewAdapter 内部调用它。
  • @Nilesh B “确保你没有多次触发它,因为你有这个本地对象”是什么意思?
  • @SaddamAlwaheab chekc 如果您多次调用此方法。

标签: android android-room android-livedata android-mvvm


【解决方案1】:

Fragment 的生命周期可以比创建的 View 的生命周期长。 将 this 替换为 viewLifecycleOwner 以观察您的 liveData 以避免重复订阅:

cartProductItemViewModel.getCartProductItemList(x).observe(viewLifecycleOwner, new Observer<List<CartProductItem>>() {
    @Override
    public void onChanged(List<CartProductItem> cartProductItems) {
        product_categoriesFragmentAdpter.setArrayList(cartProductItems, getContext());
    }
});

在使用 viewLifecycleOwner 时,确保在 onCreateView() 之前不观察 liveData。

来源:https://developer.android.com/reference/androidx/fragment/app/Fragment.html#getViewLifecycleOwner()

https://www.youtube.com/watch?v=pErTyQpA390&feature=youtu.be

【讨论】:

  • 如何将片段内的 viewLifecycleOwner 获取到 livedata 观察者
  • @SaddamAlwaheab 每个片段都可以访问 viewLifecycleOwner。由于您使用的是 java,您可能必须使用 getViewLifecycleOwner()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多