我如何摆脱使用反应式方法的崩溃(低理解)
How Do I get rid of the Crash(Low understanding) for using reactive approach
我是反应世界的新手,在我的代码库中,我决定以非常渐进的方式应用反应哲学,即一次一小步。出于这种动机,我以这种方式改变了一个功能
public List<Task> getFilteredTask() {
return Observable.fromIterable(TaskDataSource.getAllTasks())
.filter(task -> !task.isCompleted && !task.getPriority>=1)
.sorted((task!, task2) -> task.title.compareTo(task2.tilte)).toList().blockingFirst();
我暂时不得不使用 BlockingX() 运算符让我的客户收到列表。所以我不得不打开 Single Observable 。
但是我在调用这个之后出现异常?请帮助我我在这里做错了什么?
请 post 你的日志消息,尽管我非常确定你会收到此错误,因为你可能从 MainThread 调用此方法。如您所知,长 运行 操作应该推迟到主线程。
我想说的第二件事是 RxJava 是在考虑懒惰的情况下创建的。在这里,您使用 Observable.fromIterable(TaskDataSource.getAllTasks())
的 Observable Creation 违反了它,因为您可以看到 TaskDataSource.getAllTasks()
甚至在有任何观察者订阅它之前就被调用了。所以我认为通过这个修改你将摆脱崩溃
public Observable<Task> getFilteredTask() {
return Observable.defer(() ->
Observable.fromIterable(TaskDataSource.getAllTasks())).subscribeOn(Schedulers.io())
.filter(task -> !task.isCompleted && !task.getPriority>=1)
.sorted((task!, task2) -> task.title.compareTo(task2.tilte))
.observeOn(AndroidSchedulers.mainThread());
}
此外,我想说的是修改您调用客户端接受 Observable 而不是 List 。因为 Rx 社区强烈建议不要使用 BlockinX() 因为不是在数据准备就绪时推送数据,而是拉取数据并阻塞线程
希望对您有所帮助
我是反应世界的新手,在我的代码库中,我决定以非常渐进的方式应用反应哲学,即一次一小步。出于这种动机,我以这种方式改变了一个功能
public List<Task> getFilteredTask() {
return Observable.fromIterable(TaskDataSource.getAllTasks())
.filter(task -> !task.isCompleted && !task.getPriority>=1)
.sorted((task!, task2) -> task.title.compareTo(task2.tilte)).toList().blockingFirst();
我暂时不得不使用 BlockingX() 运算符让我的客户收到列表。所以我不得不打开 Single Observable 。
但是我在调用这个之后出现异常?请帮助我我在这里做错了什么?
请 post 你的日志消息,尽管我非常确定你会收到此错误,因为你可能从 MainThread 调用此方法。如您所知,长 运行 操作应该推迟到主线程。
我想说的第二件事是 RxJava 是在考虑懒惰的情况下创建的。在这里,您使用 Observable.fromIterable(TaskDataSource.getAllTasks())
的 Observable Creation 违反了它,因为您可以看到 TaskDataSource.getAllTasks()
甚至在有任何观察者订阅它之前就被调用了。所以我认为通过这个修改你将摆脱崩溃
public Observable<Task> getFilteredTask() {
return Observable.defer(() ->
Observable.fromIterable(TaskDataSource.getAllTasks())).subscribeOn(Schedulers.io())
.filter(task -> !task.isCompleted && !task.getPriority>=1)
.sorted((task!, task2) -> task.title.compareTo(task2.tilte))
.observeOn(AndroidSchedulers.mainThread());
}
此外,我想说的是修改您调用客户端接受 Observable 而不是 List 。因为 Rx 社区强烈建议不要使用 BlockinX() 因为不是在数据准备就绪时推送数据,而是拉取数据并阻塞线程
希望对您有所帮助