我如何摆脱使用反应式方法的崩溃(低理解)

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() 因为不是在数据准备就绪时推送数据,而是拉取数据并阻塞线程

希望对您有所帮助