【问题标题】:Android RxJava2 notify new data insert into a databaseAndroid RxJava2 通知新数据插入数据库
【发布时间】:2018-05-14 19:25:06
【问题描述】:

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

@Query("SELECT * FROM user")
Flowable<List<UserEntity>> getUsers();

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

我的活动onCreate 方法显示用户列表,并让插入一个带有表单的新用户。它像这样订阅 observable:

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

简化的视图模型实现是

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

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

使用BehaviorProcessor&lt;any value&gt; 是否正确,每次我成功插入新用户时都会发出一个值,并在内部观察 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);
}

这样每次我发出一个新值时,observable 都会刷新并且订阅者会获取新数据。

【问题讨论】:

  • 使用:public Completable saveuser(用户用户)。更容易
  • getUsers 返回的Flowable 将在表中的数据发生变化(添加、删除或修改用户)时发出一个新的List 包含所有用户名
  • @LordRaydenMK 这是因为 Room 实现自己做的?如果我不使用空间并从 Iterable 手动创建 Flowable 怎么办?
  • 是的,房间实现做到了。

标签: android rx-java2 android-room reactive


【解决方案1】:

就像我在 cmets Room 中提到的那样,当表格发生变化时,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的代码。

【讨论】:

  • 我可以使用 subscribeOn 之类的 rxjava 功能在不同的线程中运行删除或添加产品代码吗?
  • 是的,你可以。这可能属于客户端代码->在使用购物车的类中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多