我正在使用okhttp并对我的一个应用程序进行改造,并且我有很多请求使用Rx

Java在不同的线程上工作.

有时我在任何请求上都得到SocketException,之后没有请求可以到达服务器.

对于例如我可以分享一个样本.

我可以分享的代码中很少有修改过的代码段.

Subscription details = api.details("keyword")

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(new Subscriber() {

@Override

public void onCompleted() {

Timber.d("onCompleted(): ");

}

@Override

public void onError(Throwable e) {

Timber.e(e, "onError(): ");

}

@Override

public void onNext(final Model details) {

Timber.d("onNext(): ");

}

});

没有任何东西从3个回调中调用.

Stackstace:

11-17 15:50:53.991 16595-10314/ D/OkHttp: --> GET API_REQUEST_URL

11-17 15:50:53.991 16595-10314/ D/OkHttp: Host: HOST_NAME

11-17 15:50:53.991 16595-10314/ D/OkHttp: Connection: Keep-Alive

11-17 15:50:53.991 16595-10314/ D/OkHttp: Accept-Encoding: gzip

11-17 15:50:53.991 16595-10314/ D/OkHttp: User-Agent: okhttp/3.4.2

11-17 15:50:53.991 16595-10314/ D/OkHttp: User-Agent: Android-App

11-17 15:50:53.991 16595-10314/ D/OkHttp: --> END GET

11-17 15:50:53.992 16595-10314/ D/OkHttp:

其他IOException

11-17 16:36:04.274 28523-29137/ D/OkHttp: Host: HOST_NAME

11-17 16:36:04.274 28523-29137/ D/OkHttp: Connection: Keep-Alive

11-17 16:36:04.274 28523-29137/ D/OkHttp: Accept-Encoding: gzip

11-17 16:36:04.274 28523-29137/ D/OkHttp: User-Agent: okhttp/3.4.2

11-17 16:36:04.274 28523-29137/ D/OkHttp: User-Agent: Android-App

11-17 16:36:04.274 28523-29137/ D/OkHttp: --> END GET

11-17 16:36:04.282 28523-29137/ D/OkHttp:

订阅我试图经常工作正常,但有时上面的错误就在那里,然后停止工作.

Aferwords没有请求可以到达服务器.

改造界面的方法

@GET("/v1/app_endpoint/{keyword}/")

Observable details(@Path("keyword") String keyword);

以下几个辅助方法仅用于检查配置是否需要.

public static Retrofit retrofit() {

return provideRetrofit(provideGson(), provideOkHttpClient());

}

public static Gson provideGson() {

GsonBuilder gsonBuilder = new GsonBuilder();

gsonBuilder.addSerializationExclusionStrategy(new AnnotationExclusionStrategy());

gsonBuilder.addDeserializationExclusionStrategy(new AnnotationExclusionStrategy());

gsonBuilder.setExclusionStrategies(new ExclusionStrategy() {

@Override

public boolean shouldSkipField(FieldAttributes f) {

return f.getDeclaringClass().equals(RealmObject.class);

}

@Override

public boolean shouldSkipClass(Class> clazz) {

return false;

}

});

gsonBuilder.registerTypeAdapterFactory(AutoValueGsonTypeAdapterFactory.create());

return gsonBuilder.create();

}

public static OkHttpClient provideOkHttpClient() {

return new OkHttpClient.Builder()

.connectTimeout(30, TimeUnit.SECONDS)

.writeTimeout(600, TimeUnit.SECONDS)

.readTimeout(1, TimeUnit.MINUTES)

.retryOnConnectionFailure(true)

.addNetworkInterceptor(new Interceptor() {

@Override

public okhttp3.Response intercept(Chain chain) throws IOException {

Request newRequest = chain.request().newBuilder()

.addHeader("Content-Type", "application/json")

.addHeader("User-Agent", "Android-App")

.build();

return chain.proceed(newRequest);

}

})

.addNetworkInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))

.build();

}

public static Retrofit provideRetrofit(Gson gson, OkHttpClient okHttpClient) {

return new Retrofit.Builder()

.baseUrl(BuildConfig.API_URL)

.client(okHttpClient)

.addConverterFactory(GsonConverterFactory.create(gson))

.addCallAdapterFactory(RxJavaCallAdapterFactory.createWithScheduler(Schedulers.io()))

.build();

}

依赖

// Networking

compile 'com.squareup.okhttp3:okhttp:3.4.2'

compile 'com.squareup.retrofit2:retrofit:2.1.0'

compile 'com.squareup.retrofit2:converter-gson:2.1.0'

compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'

compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐