【发布时间】:2018-05-14 01:53:34
【问题描述】:
我正在尝试将Flowable<List<TaskEntity>> 转换为Flowable<List<Task>>,但出了点问题。
为了理解我尝试转换一个更简单的列表的问题,它工作正常。当我尝试将相同的逻辑应用于我的实际问题时,它不起作用。
这个逻辑给了我预期的输出。 [No.1 No.2 No.3]
Flowable.fromArray(Arrays.asList(1,2,3))
.flatMapIterable(ids->ids)
.map(s->"No. "+s)
.toList()
.toFlowable()
.subscribe(
t -> Log.d(TAG, "getAllActiveTasks: "+t)
);
这个逻辑是行不通的。 什么都不打印
mTaskDao.getAllTasks(STATE_ACTIVE)
.flatMapIterable(task -> task)
.map(Task::create)
.toList()
.toFlowable()
.subscribe(
t -> Log.d(TAG, "getAllActiveTasks: "+t)
);
编辑 1 这就是 Task.create() 的样子。
public static Task create(TaskEntity eTask) {
Task task = new Task(eTask.getTaskId(), eTask.getTaskTitle(), eTask.getTaskStatus());
task.mTaskDescription = eTask.getTaskDescription();
task.mCreatedAt = eTask.getCreatedAt();
task.mTaskDeadline = eTask.getTaskDeadline();
return task;
}
解决方案
如 cmets 中所述,toList() 仅在发射源具有有限数量的要发射的项目时才能工作。由于来自 Dao 的 Flowable 方法包含无限的对象流,因此我没有正确使用 toList()。
查看此评论以了解解决此问题的确切方法。 https://stackoverflow.com/a/50318832/4989435
【问题讨论】:
-
TaskEntry 和 Task 如何相互关联?
-
@LeviAlbuquerque,它们几乎相同。 TaskEntity 符合我的数据库表,从表示的角度来看,Task 更有意义。因此,在 Task.create() 中,我将更改诸如将 TaskEntity 中的时间戳转换为 Java Date 对象等内容。
-
toList需要有限的源,但getAllTasks可能是无限的,不幸的是,这在 Android 数据库支持的 DAO 中非常典型。将getAllTasks更改为Single,使用take(1),使用timeout(),或者使用flatMap(Observable.fromIterable().map().toList())而不是flatMapIterable。 -
@akarnokd,您的解释对我来说确实有意义,但我仍然感到困惑。我想接收对 db 中的任务所做的任何更新。而且我认为使用 Single 意味着它会在运行一次后停止。对吗?
标签: java android rx-java rx-java2