okHttp 添加动态的 超时时间 处理

  • 场景
      由于某个接口耗时比较长,故需要对okHttpClient添加动态的超时时间,来满足业务场景
  • 处理方式
      实现OkHttp动态添加超时时间
  • 实现原理
      查看Retrofit和OkHttpClient源码,根据Retrofit反射拿到OKHttpClient的信息并进行动态设置超时时间

  • 工具类地址
    下载链接 http://download.csdn.net/download/gl_mine_csdn/10140891

  • 处理过程

public class DynamicConnectTimeout implements Interceptor {

    private static final int CONNECT_LONG_TIMEOUT = 20;
    private static final int CONNECT_SHORT_TIMEOUT = 10;

    @Override
    public Response intercept(Chain chain) throws IOException {
        Request oldRequest = chain.request();
        setDynamicConnectTimeout(oldRequest,mRetrofit,"add you need dynamic interface");
        Request newRequest = oldRequest.newBuilder()
                .method(oldRequest.method(), oldRequest.body())
                .url(oldRequest.url())
                .build();
        return chain.proceed(newRequest);
    }

    /**
     * 根据所需接口、进行动态设置网络超时时间
     * @param oldRequest
     * @param retrofit
     */
    private void setDynamicConnectTimeout(Request oldRequest, Retrofit retrofit,String url) {
        //动态设置超时时间
        final String questUrl = oldRequest.url().url().toString();
        try {
            //1、private final okhttp3.Call.Factory callFactory;   Retrofit 的源码 构造方法中
            Field callFactoryField = retrofit.getClass().getDeclaredField("callFactory");
            callFactoryField.setAccessible(true);
            //2、callFactory = new OkHttpClient();   Retrofit 的源码 build()中
            OkHttpClient client = (OkHttpClient) callFactoryField.get(retrofit);
            //3、OkHttpClient(Builder builder)     OkHttpClient 的源码 构造方法中
            Field connectTimeoutField = client.getClass().getDeclaredField("connectTimeout");
            connectTimeoutField.setAccessible(true);
            //4、根据所需要的时间进行动态设置超时时间
            if (questUrl.contains(url)) {
                connectTimeoutField.setInt(client,CONNECT_LONG_TIMEOUT * 1000);
            } else {
                connectTimeoutField.setInt(client,CONNECT_SHORT_TIMEOUT * 1000);
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
    }
}
  • OkHttpClient 添加网络监听
 builder.addInterceptor(new DynamicConnectTimeout());
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
OKHttp是一个开源的HTTP客户端框架,用于Android平台的网络请求。它提供了简洁的API和强大的功能,使得在Android应用中进行网络请求变得更加方便和高效。 使用OKHttp可以发送HTTP请求、接收和解析服务器响应、处理网络错误等。它支持GET、POST、PUT、DELETE等常见的HTTP方法,并且可以设置请求头、请求体、超时时间等。此外,OKHttp还支持文件上传和下载,以及WebSocket协议。 在Android开发中,你可以通过添加OKHttp库的依赖,然后在代码中创建OKHttp的实例,使用它来发送网络请求。下面是一个简单的示例: ```java // 添加OKHttp库的依赖 implementation 'com.squareup.okhttp3:okhttp:4.9.1' // 创建OKHttp实例 OkHttpClient client = new OkHttpClient(); // 创建请求对象 Request request = new Request.Builder() .url("http://www.example.com/api/data") .build(); // 发送异步请求 client.newCall(request).enqueue(new Callback() { @Override public void onResponse(Call call, Response response) throws IOException { // 处理服务器响应 String responseData = response.body().string(); // ... } @Override public void onFailure(Call call, IOException e) { // 处理网络错误 e.printStackTrace(); // ... } }); ``` 以上代码中,首先添加OKHttp库的依赖。然后创建了一个OKHttpClient实例,用于发送请求。接着创建了一个Request对象,设置了请求的URL。最后通过调用`client.newCall(request).enqueue()`方法发送异步请求,并在回调方法中处理服务器响应和网络错误。 需要注意的是,网络请求应该在后台线程中执行,以避免阻塞主线程。你可以使用`AsyncTask`、`Thread`或者`Coroutine`等方式来实现在后台线程中执行网络请求。 当然,OKHttp还有更多的功能和用法,例如设置请求参数、请求拦截器、HTTPS支持等。你可以查阅官方文档或其他资源来深入学习和使用OKHttp

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值