RxJava Возникли проблемы при преобразовании одного списка в другой. - PullRequest
0 голосов
/ 13 мая 2018

Я пытаюсь преобразовать Flowable<List<TaskEntity>> в Flowable<List<Task>>, но что-то не так. Чтобы понять проблему, я попытался преобразовать более простой список, и он работает нормально. Когда я пытаюсь применить ту же логику к моей реальной проблеме, она не работает.


Эта логика дает мне ожидаемый результат. [№ 1 № 2 № 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 () может работать, только если исходящий источник имеет конечное число элементов для излучения. Поскольку метод Flowable from Dao содержит бесконечный поток объектов, метод toList () был использован мной неправильно.

Ознакомьтесь с этим комментарием для точного решения этой проблемы. https://stackoverflow.com/a/50318832/4989435

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

toList требует ограниченного источника, но getAllTasks, вероятно, бесконечен, что, к сожалению, довольно типично для DAO, поддерживаемых базами данных Android.Измените getAllTasks на Single, используйте take(1), используйте timeout() или flatMap(Observable.fromIterable().map().toList()) вместо flatMapIterable.

Я хочу получать любые обновления, сделанные для задач вдБ.

В этом случае вам понадобится последний вариант:

mTaskDao.getAllTasks(STATE_ACTIVE)
        .flatMapSingle(task -> 
             Observable.fromIterable(task)
            .map(Task::create)
            .toList()
        )
        .subscribe(
                t -> Log.d(TAG, "getAllActiveTasks: "+t)
        );
0 голосов
/ 13 мая 2018

Вы должны использовать только оператор карты для преобразования TaskEntity в Task.Я создал образец .Вы можете проверить мое решение, которое использует только оператор карты

...