我正在尝试将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;
}
解决方案
如评论中所述,toList()只有在发射源具有有限数量的项目时才能工作。由于来自Dao方法的Flowable包含无限的对象流,因此我没有正确使用toList()。
查看此评论以了解解决此问题的确切方法。 https://stackoverflow.com/a/50318832/4989435
答案 0 :(得分:3)
toList
需要有限的来源,但getAllTasks
可能是无限的,不幸的是,这是由Android数据库支持的DAO非常典型。将getAllTasks
更改为Single
,使用take(1)
,使用timeout()
,或使用flatMap(Observable.fromIterable().map().toList())
代替flatMapIterable
。
我希望收到对db。
中的任务所做的任何更新
在这种情况下,您需要后一个选项:
mTaskDao.getAllTasks(STATE_ACTIVE)
.flatMapSingle(task ->
Observable.fromIterable(task)
.map(Task::create)
.toList()
)
.subscribe(
t -> Log.d(TAG, "getAllActiveTasks: "+t)
);
答案 1 :(得分:0)
您应该只使用map运算符将TaskEntity转换为Task。我创建了sample。您可以检查我的解决方案,该解决方案仅使用地图运算符