相关疑难解决方法(0)

在retryOn中将Retrofit2与rx一起使用时出现InterruptedIOException

我正在使用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 rx-java okhttp rx-android retrofit2

7
推荐指数
0
解决办法
1595
查看次数

Robolectric + rxJava + retrofit第二次调用抛出java.io.InterruptedIOException

我正在开发和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)

testing android robolectric rx-java retrofit

6
推荐指数
1
解决办法
1821
查看次数