一般来说,普通的请求超时时间是15s,但是有的时候上传文件15s根本不够,那怎么办呢?
设置两个okhttp不够优雅,我们可以使用Interceptor,内置了帮我们设置动态超时的方法。
/**
* Observes, modifies, and potentially short-circuits requests going out and the corresponding
* responses coming back in. Typically interceptors add, remove, or transform headers on the request
* or response.
*/
public interface Interceptor {
Response intercept(Chain chain) throws IOException;
interface Chain {
Request request();
Response proceed(Request request) throws IOException;
/**
* Returns the connection the request will be executed on. This is only available in the chains
* of network interceptors; for application interceptors this is always null.
*/
@Nullable Connection connection();
Call call();
int connectTimeoutMillis();
Chain withConnectTimeout(int timeout, TimeUnit unit); //重点在这
int readTimeoutMillis();
Chain withReadTimeout(int timeout, TimeUnit unit);//重点在这
int writeTimeoutMillis();
Chain withWriteTimeout(int timeout, TimeUnit unit);//重点在这
}
}
具体代码:
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.concurrent.TimeUnit;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import retrofit2.Retrofit;
/**
* 动态设置接口请求超时时间
*/
public class DynamicConnectTimeout implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request reequest = chain.request();
String questUrl = reequest.url().toString();
boolean isUploadVideoApi = questUrl.contains(API.uploadVideoApi);
if (isUploadVideoApi) {
return chain.withConnectTimeout(200, TimeUnit.SECONDS)
.withReadTimeout(200, TimeUnit.SECONDS)
.withWriteTimeout(200, TimeUnit.SECONDS)
.proceed(reequest);
}
return chain.proceed(reequest);
}
}
然后设置
OkHttpClient.Builder builder = new OkHttpClient.Builder()
.addInterceptor(new DynamicConnectTimeout())
.readTimeout(READ_TIMEOUT, TimeUnit.SECONDS)//设置读取超时时间
.writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS)//设置写的超时时间
.connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS);//设置连接超时时间