2017-11-17 51 views
2
public class Router { 

    ... 

    private static Retrofit retrofit = null; 

    ... 

    public Retrofit getRetrofit() { 
     if (retrofit == null) { 

      ... 

      OkHttpClient client = new OkHttpClient.Builder() 
        .connectTimeout(30, TimeUnit.SECONDS) 
        .writeTimeout(60, TimeUnit.SECONDS) 
        .readTimeout(60, TimeUnit.SECONDS) 
        .build(); 

      retrofit = new Retrofit.Builder() 
        .baseUrl("***") 
        .addConverterFactory(GsonConverterFactory.create()) 
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 
        .client(client) 
        .build(); 
     } 
     return retrofit; 
    } 

    ... 

} 

セットアップタイムアウトはOkHttpClientです。現在、APIには異なるタイムアウトが必要です。retrofit2で動的にタイムアウトを設定する方法は?

どうすればいいですか?

このような画像がありますか?

@Timeout 
Observable<ResponseBody> exapmle(@Timeout("connect") int connect 
, @Timeout("read") int read 
, @Timeout("write") int write); 
+0

あなたがタイムアウトを増やしたいのy?例外やエラーはありますか? –

+0

大きなファイルをアップロードするためのAPIがあります。 –

答えて

0

enter image description here

どうもありがとう:

public Retrofit getRetrofit(int connectionTimeout, int readWriteTimeout) { 
     if (retrofit == null) { 

      ... 

      OkHttpClient client = new OkHttpClient.Builder() 
        .connectTimeout(connectionTimeout, TimeUnit.SECONDS) 
        .writeTimeout(readWriteTimeout, TimeUnit.SECONDS) 
        .readTimeout(readWriteTimeout, TimeUnit.SECONDS) 
        .build(); 

      retrofit = new Retrofit.Builder() 
        .baseUrl("***") 
        .addConverterFactory(GsonConverterFactory.create()) 
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 
        .client(client) 
        .build(); 
     } 
     return retrofit; 
    } 

は、以下のようなオプションがありません。ここ

は私のコードです:

public static final String CONNECT_TIMEOUT = "CONNECT_TIMEOUT"; 
public static final String READ_TIMEOUT = "READ_TIMEOUT"; 
public static final String WRITE_TIMEOUT = "WRITE_TIMEOUT"; 

... 

Interceptor timeoutInterceptor = new Interceptor() { 
    @Override 
    public Response intercept(Chain chain) throws IOException { 
     Request request = chain.request(); 

     int connectTimeout = chain.connectTimeoutMillis(); 
     int readTimeout = chain.readTimeoutMillis(); 
     int writeTimeout = chain.writeTimeoutMillis(); 

     String connectNew = request.header(CONNECT_TIMEOUT); 
     String readNew = request.header(READ_TIMEOUT); 
     String writeNew = request.header(WRITE_TIMEOUT); 

     if (!TextUtils.isEmpty(connectNew)) { 
      connectTimeout = Integer.valueOf(connectNew); 
     } 
     if (!TextUtils.isEmpty(readNew)) { 
      readTimeout = Integer.valueOf(readNew); 
     } 
     if (!TextUtils.isEmpty(writeNew)) { 
      writeTimeout = Integer.valueOf(writeNew); 
     } 

     return chain 
       .withConnectTimeout(connectTimeout, TimeUnit.MILLISECONDS) 
       .withReadTimeout(readTimeout, TimeUnit.MILLISECONDS) 
       .withWriteTimeout(writeTimeout, TimeUnit.MILLISECONDS) 
       .proceed(request); 
    } 
}; 

OkHttpClient httpClient = new OkHttpClient.Builder() 
     .connectTimeout(DEFAULT_CONNECT_TIMEOUT, TimeUnit.MILLISECONDS) 
     .writeTimeout(DEFAULT_WRITE_TIMEOUT, TimeUnit.MILLISECONDS) 
     .readTimeout(DEFAULT_READ_TIMEOUT, TimeUnit.MILLISECONDS) 
     .addInterceptor(timeoutInterceptor) 
     .build(); 

retrofit = new Retrofit.Builder() 
     .baseUrl(Host.Develop.ACCOUNT_HOST) 
     .addConverterFactory(GsonConverterFactory.create()) 
     .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 
     .client(httpClient) 
     .build(); 

... 

使用例:

/** 
* check account status 
* 
* @param account 
* @return 
*/ 
@Headers({"CONNECT_TIMEOUT:10000", "READ_TIMEOUT:10000", "WRITE_TIMEOUT:10000"}) 
@GET("login/prelogin") 
Observable<ResponseBody> preLogin(@Query("account") String account); 

または

/** 
* check account status 
* 
* @param connectTimeout 
* @param readTimeout 
* @param writeTimeout 
* @param account 
* @return 
*/ 
@GET("login/prelogin") 
Observable<ResponseBody> preLogin(
     @Header("CONNECT_TIMEOUT") String connectTimeout, 
     @Header("READ_TIMEOUT") String readTimeout, 
     @Header("WRITE_TIMEOUT") String writeTimeout, 
     @Query("account") String account); 
1

パラメータとしてタイムアウト値を渡す新しいレトロフィットインスタンスを作成します。

@Timeout 
Observable<ResponseBody> exapmle(@Timeout("connect") int connect 
       , @Timeout("read") int read 
       , @Timeout("write") int write); 
+0

新しいインスタンスを作成せずに優れたソリューションがありますか? –

関連する問題