gpt4 book ai didi

android - 使用 REST 从 firebase 检索信息并使用 Retrofit 和 RxJava 进行解析时出现问题

转载 作者:太空宇宙 更新时间:2023-11-03 12:47:13 26 4
gpt4 key购买 nike

好吧,我一直在努力使用 REST API 响应来处理 Firebase 响应。问题是我不想为 Firebase 使用 Android 的库,而是使用原始的 rest api。长话短说,Firebase 的响应是:

{
"object1": {
"param1": true,
"param2": "05",
"param3": "String",
},
"object2": {
"param1": true,
"param2": "09",
"param3": "String",
}
}

retrofit 界面:

public interface ApiCalls {
@GET("/objects.json")
Observable<List<MyObject>> getObjects();
}

Gson Builder、Retrofit Builder 和 RxJava:

    Gson gson = new GsonBuilder()
.setLenient()
.create();

Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://my-service.firebaseio.com")
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create(gson))
.client(okHttpClient)
.build();

ApiCalls api = retrofit.create(ApiCalls.class);

rx.Observable<List<MyObject>> call2 = api.getObjects();
call2.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<List<MyObject>>() {
@Override
public void onCompleted() {
Log.d("onCompleted", "Its completed");
}

@Override
public void onError(Throwable e) {
Log.d("onError", e.getMessage());
}

@Override
public void onNext(List<MyObject> MyObjects) {
Log.d("onNext", "NextItem");
}
});

执行时出现错误:

java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

有没有办法使用 RxJava 来解决这个问题,以便迭代来自服务器的对象列表?因为现在我期待一个数组,但 firebase 的响应不是一个数组,有没有办法解决这个问题?

最佳答案

好吧,感谢这条评论,我可以解决这个问题:

@VeereshCharantimath that is indeed the cause of the error: the JSON from Firebase is a map (Map), not a list. Care to post an answer? – Frank van Puffelen

在我修改响应的预期值后它开始工作:

改造 Api 调用

public interface ApiCalls {
@GET("/objects.json")
Observable<HashMap<String, MyObject>> getObjects();
}

RxJava

rx.Observable<HashMap<String, MyObject>> call2 = api.getObjects();
call2.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<HashMap<String, MyObject>>() {
@Override
public void onCompleted() {
Log.d("onCompleted", "Its completed");
}

@Override
public void onError(Throwable e) {
Log.d("onError", e.getMessage());
}

@Override
public void onNext(HashMap<String, MyObject> MyObjects) {
Log.d("onNext", "NextItem");
}
});

关于android - 使用 REST 从 firebase 检索信息并使用 Retrofit 和 RxJava 进行解析时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40757433/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com