Android RxJava2 通知新数据插入数据库

Android RxJava2 notify new data insert into a database

我有一个 Android 应用程序,其数据层由可通过 Room 访问的数据库资源表示。这是我的 DAO

的两种方法
@Query("SELECT * FROM user")
Flowable<List<UserEntity>> getUsers();

@Insert(onConflict = OnConflictStrategy.REPLACE)
void saveUser(final UserEntity user);

我的 Activity onCreate 方法显示了用户列表,并让我们插入一个带有表单的新列表。它像这样订阅可观察对象:

mUserViewModel.getUsers()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe (this::populateList)

简化视图模型实现是

public Flowable<List<User>> getUsers(){
    return repository.getUsers();
}

现在我想知道当我成功将新用户插入数据库以刷新用户列表时通知我的可观察对象的最佳方式是什么?

使用 BehaviorProcessor<any value> 是否正确,每次我成功插入一个新用户并观察 BehaviorProcessor 并在内部观察到 switchMap 方法时发出一个值?

这是一个带有过滤器的示例:

BehaviorProcessor<String> mFilter = BehaviorProcessor.createDefault(DEFAULT_VALUE);

public Flowable<List<User>> getUsers(){
    return repository.getUsers()
        .switchMap(users -> mFilter.map(this::filterList));
}

public void saveUser(User user){
    repository.saveUser(user);
    filter.emit(DEFAULT_VALUE);
}

这样,每次我发出一个新值时,可观察对象都会刷新,而订阅者会获得新数据。

就像我在评论中提到的那样,当 table 发生变化时,Room 已经负责发出一个项目。

为了解决您问题的另一部分,这里提供了反应式购物车的示例代码。 (项目而不是用户)

/**
 * Holds a list of items that has been added to the shopping cart
 *
 * @author Hannes Dorfmann
 */
public class ShoppingCart {
  private BehaviorSubject<List<Product>> itemsInShoppingCart =
      BehaviorSubject.createDefault(Collections.emptyList());

  /**
   * An observable to observe the items in the shopping cart
   */
  public Observable<List<Product>> itemsInShoppingCart() {
    return itemsInShoppingCart;
  }

  /**
   * Adds a product to the shopping cart
   */
  public Completable addProduct(Product product) {
    List<Product> updatedShoppingCart = new ArrayList<>();
    updatedShoppingCart.addAll(itemsInShoppingCart.getValue());
    updatedShoppingCart.add(product);
    itemsInShoppingCart.onNext(updatedShoppingCart);
    return Completable.complete();
  }

  /**
   * Remove a product to the shopping cart
   */
  public Completable removeProduct(Product product) {
    List<Product> updatedShoppingCart = new ArrayList<>();
    updatedShoppingCart.addAll(itemsInShoppingCart.getValue());
    updatedShoppingCart.remove(product);
    itemsInShoppingCart.onNext(updatedShoppingCart);
    return Completable.complete();
  }

  /**
   * Remove a list of Products from the shopping cart
   */
  public Completable removeProducts(List<Product> products) {
    List<Product> updatedShoppingCart = new ArrayList<>();
    updatedShoppingCart.addAll(itemsInShoppingCart.getValue());
    updatedShoppingCart.removeAll(products);
    itemsInShoppingCart.onNext(updatedShoppingCart);
    return Completable.complete();
  }
}

代码来自 here.