Skip to content

超时设置

liujingxing edited this page Feb 25, 2023 · 9 revisions

1、设置全局连接、读、写超时

RxHttp内部默认的读、写、连接超时时间均为10s,如需修改,请自定义OkHttpClient对象,如下:

//设置读、写、连接超时时间为15s
OkHttpClient client = new OkHttpClient.Builder()
    .connectTimeout(15, TimeUnit.SECONDS)
    .readTimeout(15, TimeUnit.SECONDS)
    .writeTimeout(15, TimeUnit.SECONDS)
    .build();
RxHttpPlugins.init(client);

2、设置局部连接、读、写超时

如果部分请求需要单独设置连接、读、写超时,则可以如下:

RxHttp.get("/service/...")
    .connectTimeout(3000)  //连接超时3s  RxJava/协程下均有效
    .readTimeout(4000)     //读超时4s    RxJava/协程下均有效
    .writeTimeout(5000)    //写超时5s    RxJava/协程下均有效
    .toObservableString()            
    .subscribe(s -> {
        //成功回调
    }, (OnError) error -> {
        //失败回调
    });

注:以上连接,读,写操作符在v2.3.4版本加入的

3、为单个请求设置总超时

总超时的意思是,规定时间内要完成某件事情,否则抛出异常,为单个请求设置总超时,使用timeout操作符,如下:

//协程
val str = RxHttp.get("/service/...")
    .toAwaitString()
    .timeout(5000)  //设置总超时时间为5s,在toAwaitXxx方法后调用
    .await()

//RxJava
RxHttp.get("/service/...")
    .toObservableString()
    .timeout(5, TimeUnit.SECONDS)  //设置总超时时间为5s,在toObservableXxx方法后调用
    .subscribe(s -> {
        //成功回调
    }, (OnError) error -> {
        //失败回调
    });

注:这里设置的总超时时长要小于读、写、连接超时时间之和,否则无效

4、区别

  • connectTimeout是指客户端连接服务器的超时时长

  • readTimeout 是指单次读取数据的超时时长,如下载文件时,会读取多次

  • writeTimeout是指单次写数据的超时时长,如上传文件时,会写多次

  • timeout是指请求开始到结束的超时时长,具体代表规定时间内要完成某件事情,如:6s内要完成下载任务,否则抛出超时异常

对于connectTimeout、readTimeout、writeTimeout这三个,如遇超时,会抛出java.net.SocketTimeoutException异常;

对于协程下的timeout操作符,如遇超时,会抛出kotlinx.coroutines.TimeoutCancellationException异常;

对于RxJava下的timeout操作符,如遇超时,会抛出java.util.concurrent.TimeoutException异常;