我多次调用 Livedata 观察器时遇到问题
I have a problem with Livedata observer called multiple time
这是我的 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());
}
});
}
更新或删除 table 或插入多次调用的观察者时出现的问题。
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
这是我的 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());
}
});
}
更新或删除 table 或插入多次调用的观察者时出现的问题。
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