android - RxJava - 使用 GroupedObservable

标签 android rx-java

给定以下代码:

bcxClient
  .fetchToDos()
  .flatMap(new Func1<List<BcxToDo>, Observable<BcxToDo>>() {
    @Override
    public Observable<BcxToDo> call(List<BcxToDo> bcxToDos) {
      return Observable.from(bcxToDos);
    }
  })
  .groupBy(new Func1<BcxToDo, BcxToDoList>() {
    @Override
    public BcxToDoList call(BcxToDo bcxToDo) {
      return bcxToDo.toDoList;
    }
  })
  .toList();

返回 List<GroupedObservable<>> .在我的代码中,我需要计算每个 GroupedObservable 中有多少个对象。如果我使用 count()函数返回 Observable<int> .以下代码将不起作用:

@Override
public int getChildrenCount(int groupPosition) {
    int count;

    mToDoList.get(groupPosition)
        .count()
        .subscribe( new Action1<Integer>() {
            @Override
            public void call(Integer integer) {
                count = integer;
            }
        });

    return count;
}

如果我将局部变量设为 final,则无法为其赋值。

据我所知,我有两个选择。将每个分组的计数存储在属于该类的字段中,或将 GroupedObservable 转换为链中的替代结构(上图)。如果是这种情况,最好的方法是什么?

这是我为翻译 GroupedObservable 而编写的代码:

.flatMap( new Func1<GroupedObservable<BcxToDoList, BcxToDo>, Observable<BcxToDoList>>() {
  @Override
  public Observable<BcxToDoList> call(final GroupedObservable<BcxToDoList, BcxToDo> bcxToDoListBcxToDoGroupedObservable) {
    return bcxToDoListBcxToDoGroupedObservable
      .toList()
      .flatMap( new Func1<List<BcxToDo>, Observable<BcxToDoList>>() {
        @Override
        public Observable<BcxToDoList> call(List<BcxToDo> bcxToDos) {
          bcxToDoListBcxToDoGroupedObservable.getKey().toDos.addAll( bcxToDos );

          return Observable.just( bcxToDoListBcxToDoGroupedObservable.getKey() );
        }
      });
  }
})

我不确定这是不是最好的方法

最佳答案

你的第一次尝试没有成功,因为 count 是一个原始值而不是一个对象。

要获取计数,您可以阻塞并获取值。 (但是当前线程会阻塞)

@Override
public int getChildrenCount(int groupPosition) {
    int count = mToDoList.get(groupPosition).toBlocking().single();
    return count;
}

如果你不想阻塞,使用类似Pair的结构似乎是个好主意

 bcxClient
   .fetchToDos()
   .flatMap(Observable::from)
   .groupBy(bcxToDo-> bcxToDo.toDoList)
   .flatMap(todo -> todo.count().map(c -> new Pair(todo, c))
   .toList()
   .subscribe(pair -> //** iter over your list **//); 

关于android - RxJava - 使用 GroupedObservable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29323382/

相关文章:

android - 实现 ListFragment 时隐藏 "Loading..."指示器

android - 我怎样才能创建效果隐藏数字信用卡除了最后 3 个数字

android - 以从历史记录中恢复的相同方式恢复我的应用程序

scala - 检查可观察对象是否完成的好方法是什么

java - 如何在 Flowable 上执行操作

android - 如何在没有 subscribe() 的情况下处理 BlockingObservable 中的错误?

java - 捕获对话框中按钮的单击事件

android - 如何获得有关 Activity 生命周期的通知

rx-java - 使用 RxJava 处理可变对象流

android - 让所有 Observables 订阅并观察某事