当我尝试单一可观察物时,为什么不可观察物不起作用

时间:2019-10-09 19:32:27

标签: android rx-java rx-java2

我对可观察的单个对象和对象列表感到困惑

当我对Observable执行以下操作时,它将起作用

改造界面MainApi:

    Observable<Todo> getTodos();

活动中:

    mainApi.getTodos()
    .subscribeOn(Schedulers.io())
            .concatMap(new Function<List<Todo>, ObservableSource<Todo>>() {
                @Override
                public ObservableSource<Todo> apply(List<Todo> todos) throws Exception {
                      return Observable.fromIterable(todos).subscribeOn(Schedulers.io());
                }
            })
            .subscribe(new Observer<Todo>() {
                @Override
                public void onSubscribe(Disposable d) {
                    Log.d("LogMe", ">>>Inside susbcribed>>>");
                }

                @Override
                public void onNext(Todo todo) {
                    Log.d("LogMe", ">>>Inside onNExt>>>" +  todo.getName());

                }

                @Override
                public void onError(Throwable e) {
                    Log.d("LogMe", ">>>Inside onError>>>" +e.toString());
                }

                @Override
                public void onComplete() {
                    Log.d("LogMe", ">>>Inside onComplete>>>");
                }
            });

但是当使用Observable时,它将不起作用。

改造界面MainApi:

    Observable<Todo> getTodos();

活动中:

    mainApi.getTodos().subscribeOn(Schedulers.io())
        .map(new Function<Todo, String>() {

            @Override
            public  String apply(Todo todo) throws Exception {
            return todo.getName();
            }
        })
        .doOnNext(new Consumer<String>() {
            @Override
            public void accept(String stringObservable) throws Exception {
            Log.d("LogMe", ">>>Inside >>> doOnNext");
            }
        })
    .subscribe(new Observer<String>() {
               @Override
               public void onSubscribe(Disposable d) {
               Log.d("LogMe", ">>>Inside susbcribed>>>");
               }

               @Override
               public void onNext(String stringObservable) {
               Log.d("LogMe", ">>>Inside onNExt>>>");
               }

               @Override
               public void onError(Throwable e) {
               Log.d("LogMe", ">>>Inside onError>>>" +e.toString());
               }

               @Override
               public void onComplete() {
               Log.d("LogMe", ">>>Inside Presenter onComplete>>>");
               }
           });

然后我得到了错误:

LogMe:>>>内部演示者onError >>> com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:预期为BEGIN_OBJECT,但在第1行第2列路径$ BEGIN_ARRAY中

我要去哪里错了?如果可以通过单个观察得到结果,那我该如何遍历Todo的每个项目/对象?

1 个答案:

答案 0 :(得分:0)

  

com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:   预期为BEGIN_OBJECT,但位于第1行第2列路径的BEGIN_ARRAY

错误来自Gson库。

  

为什么会出现此错误,该错误是什么意思?

此错误仅表示Gson无法将JSON反序列化为Java Object。 因为Gson期望使用JSON对象,并且意外地从响应中接收到JSON数组。

  

如何解决?

您可以通过将Observable<Todo> getTodos();的返回类型更改为Observable<List<Todo>> getTodos();

轻松修复它

希望这会有所帮助!!

快乐编码:)