【发布时间】:2018-09-09 01:38:48
【问题描述】:
我一直在为我的 Android 应用程序的 REST API 调用使用 Retrofit,并且效果很好。但是,我遇到了有关失去连接和请求失败的问题。我的应用程序涉及以编程方式连接到 WiFi 网络,然后在连接后发出 API 调用以进行初始化。然而,有时这些连接很慢,我需要一种方法来在它们失败时重新发送这些请求。这就是我转向 RxJava 的地方,因为 Retrofit 不支持这个。我想要做的是,一旦连接到新的 WiFi 网络,就会向 REST API 发出 ping,如果出现网络错误,请等待一秒钟并重试 ping。这是我的代码:
接口中的函数声明:
@Headers("Content-Type: application/json")
@GET("something")
io.reactivex.Observable<String> ping();
Activity 中的改造声明
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Data.cloudEndpoint)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
avfsService = retrofit.create(MyClass.class);
尝试在 Activity 中执行 API 调用
service.ping()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.retryWhen(new Function<Observable<Throwable>, ObservableSource<?>>() {
@Override
public ObservableSource<?> apply(Observable<Throwable> throwableObservable) throws Exception {
Log.d(TAG, "retryWhen");
return Observable.timer(1, TimeUnit.SECONDS);
}
})
.blockingSubscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
Log.d(TAG, "onSubscibe " + d.toString());
}
@Override
public void onNext(String s) {
Log.d(TAG, "onNext " + s);
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "onError");
e.printStackTrace();
}
@Override
public void onComplete() {
Log.d(TAG, "onComplete");
launch();
}
});
所以这里执行的时候是我在 Logcat 中看到的输出
onSubscibe null
retryWhen
onComplete
所以永远不会调用 onNext,我不太清楚为什么。我认为每次从 Observable 发出数据时都会调用 onNext,并且我认为通过创建 Observable 并订阅它,API 调用将被执行,并且响应将由 Observable 发出。情况似乎并非如此,因为我现在什至无法重新创建网络错误,并且会立即调用 onComplete。
我在这里使用blockingSubscribe,因为我看到其他人说在io线程上执行并在主线程上观察会有所帮助,但没有运气。当我只使用 .subscribe() 时,我看到了相同的行为。
我想我遗漏了一些东西,但不明白我的 API 调用是否没有被执行,或者我只是没有得到正确的响应。
非常感谢任何帮助。
【问题讨论】:
标签: android rest retrofit rx-java2