2017-12-13 8 views
2
Retrofitため

Iセットアップ:Retrofit2てSocketTimeoutException

private Interceptor interceptor = new Interceptor() { 
     @Override 
     public Response intercept(Chain chain) throws IOException { 
      Request request = chain.request(); 
      if (!NetworkUtil.isNetworkAvailable()) { 
       request = request.newBuilder() 
         .cacheControl(CacheControl.FORCE_CACHE) 
         .build(); 
      } 
      Response response = chain.proceed(request); //Exception here 

      if (NetworkUtil.isNetworkAvailable()) { 
       String cacheControl = request.cacheControl().toString(); 
       response = response.newBuilder() 
         .removeHeader("Pragma") 
         .removeHeader("Cache-Control") 
         .header("Cache-Control", cacheControl) 
         .build(); 
      } else { 
       int maxStale = 60 * 60 * 24 * 7; 
       response = response.newBuilder() 
         .removeHeader("Pragma") 
         .removeHeader("Cache-Control") 
         .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale) 
         .build(); 
      } 
      return response; 
     } 
    }; 

そして私は、セットアップキャッシュに使用します。

builder = new OkHttpClient.Builder() 
        .cookieJar(new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(Apploader.context))) 
        .addNetworkInterceptor(interceptor) 
        .addInterceptor(interceptor) 
        .cache(cache) 
        .connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS); 

いつか時に自分のアプリケーションのクラッシュ、サーバーの応答が長すぎるそれはライン上で破るSocketTimeOut

ので、 :Response response = chain.proceed(request);私はコメントします。 SocketTimeOutIOExceptionのサブクラスなので、なぜ私のコードでそれをキャッチできません。 この問題を解決する方法を教えてください。

答えて

1

follwingのような複数の構成のために使用OkHttpClient、:

final OkHttpClient okHttpClient = new OkHttpClient.Builder() 
    .connectTimeout(20, TimeUnit.SECONDS) 
    .writeTimeout(20, TimeUnit.SECONDS) 
    .readTimeout(30, TimeUnit.SECONDS) 
    .build(); 

をしてから、このokHttpClient で設定し、

Retrofit.Builder() 
    .client(okHttpClient); 
2
あなたは簡単に換装通話中に発生した例外を処理するために改造コールバックメソッドを使用することができます

。 onResponse()およびonFailure()はメソッドをオーバーライドします。 レトロフィットコールが成功した場合、onResponse()がトリガされます。コールが失敗した場合や例外が発生した場合は、onFailure()がトリガされます。あなたが改造コールバック

https://www.journaldev.com/13639/retrofit-android-example-tutorial https://www.androidhive.info/2016/05/android-working-with-retrofit-http-library/

+0

こんにちは@EKNについて良いアイデアのためのチュートリアルの下に参照することができます

、私の更新を参照してください。私は、Interceptorを使ってCacheを設定します。ここでonFaildをどのようにキャッチしますか? – phongvan