我正在使用rx-android改装2
我有相当复杂的重试逻辑,部分工作.我切断了不相关的代码来简化它.这里是:
public class RetryWithDelay implements Func1<Observable<? extends Throwable>, Observable<?>>, Constants {
@Override
public Observable<?> call(Observable<? extends Throwable> attempts) {
return attempts.flatMap(new Func1<Throwable, Observable<?>>() {
@Override
public Observable<?> call(Throwable throwable) {
int statusCode = 500;
if (throwable instanceof HttpException) {
HttpException httpException = (HttpException) throwable;
statusCode = httpException.code();
}
boolean shouldRetry = shouldRetry();
if (shouldRetry && statusCode == 401 && requiresAuthorization) {
LoginProvider provider = AppUtils.getExternalProvider(context);
switch (provider) {
case GOOGLE:
return reauthorizeGoogleProvider();
case FACEBOOK:
return reauthorizeFacebookProvider();
default: …Run Code Online (Sandbox Code Playgroud) 我正在开发和Android应用程序.我正在使用改进(使用OkClient)进行api请求和使用Robolectric进行测试.我的api看起来像这样:
@GET("/v1/book/{bookId}") Observable<Book> getBook(@Path("bookId") int bookId);
Run Code Online (Sandbox Code Playgroud)
仅仅对于Robolectric我强迫api调用是同步的.restAdapter构建器如下所示:
RestAdapter.Builder builder = new RestAdapter.Builder().setEndpoint(environment.getServerEndpoint())
.setClient(new OkClient(client))
.setExecutors(new ImmediateExecutor(), null)
.setErrorHandler(new ErrorHandler())
.setRequestInterceptor(new RequestInterceptor() {
@Override
public void intercept(RequestFacade request) {
// Always ask for JSON data
request.addHeader("Accept", "application/json");
request.addHeader("Content-Type", "application/json");
}
});
public class ImmediateExecutor implements Executor {
@Override public void execute(Runnable command) {
command.run();
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个简单的测试,如下所示:
API.getBook(1).subscribe();
API.getBook(2).subscribe();
Run Code Online (Sandbox Code Playgroud)
Restadapter是使用构建器创建的,以及带有它的API对象(restadapter.create(...)).我省略了它,因为它是微不足道的.
第一个工作没有问题,但第二个应该是相同的抛出异常:
java.io.InterruptedIOException
at okio.Timeout.throwIfReached(Timeout.java:146)
at okio.Okio$1.write(Okio.java:75)
at okio.AsyncTimeout$1.write(AsyncTimeout.java:155)
at okio.RealBufferedSink.flush(RealBufferedSink.java:201)
at com.squareup.okhttp.internal.http.HttpConnection.flush(HttpConnection.java:140)
at com.squareup.okhttp.internal.http.HttpTransport.finishRequest(HttpTransport.java:52)
at com.squareup.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:828)
at com.squareup.okhttp.internal.http.HttpEngine.access$200(HttpEngine.java:95)
at com.squareup.okhttp.internal.http.HttpEngine$NetworkInterceptorChain.proceed(HttpEngine.java:823)
at …Run Code Online (Sandbox Code Playgroud) android ×2
rx-java ×2
okhttp ×1
retrofit ×1
retrofit2 ×1
robolectric ×1
rx-android ×1
testing ×1