日常-okhttp

1. 背景

 

2. 介绍

2.1 为什么okhttp性能好

  • 支持http2,对一台机器的所有请求共享同一个socket
  • 内置连接池,支持连接复用,减少延迟(连接池复用)
  • 支持透明的gzip压缩响应体(请求头Content-Encoding:gzip,body有内容)
  • 通过缓存避免重复的请求(缓存)
  • 请求失败时自动重试主机的其他ip,自动重定向(重试)

2.2 okhttp工作流程

3. 源码

3.1 socket连接池复用

okhttp3.internal.connection.RealConnectionPool#transmitterAcquirePooledConnection。这是入口okhttp3.internal.connection.Transmitter#newExchange$okhttp

fun transmitterAcquirePooledConnection(
    address: Address,
    transmitter: Transmitter,
    routes: List<Route>?,
    requireMultiplexed: Boolean
  ): Boolean {
    assert(Thread.holdsLock(this))
    for (connection in connections) {
      if (requireMultiplexed && !connection.isMultiplexed) continue
      if (!connection.isEligible(address, routes)) continue
      // 复用连接
      transmitter.acquireConnectionNoEvents(connection)
      return true
    }
    return false
  }

3.2 支持透明的gzip压缩响应体(请求头Content-Encoding:gzip,body有内容)

okhttp源码中执行请求时,会进行synchronized限制(对象锁)。不允许重复请求。

override fun execute(): Response {
    synchronized(this) {
      check(!executed) { "Already Executed" }
      executed = true
    }
    transmitter.timeoutEnter()
    transmitter.callStart()
    try {
      client.dispatcher.executed(this)
      return getResponseWithInterceptorChain()
    } finally {
      client.dispatcher.finished(this)
    }
  }

4. 实战

4.1 如何使用OkhttpClient

public static void main(String[] args) throws IOException {
        String url = "http://wwww.baidu.com";
        OkHttpClient okHttpClient = new OkHttpClient();
        final Request request = new Request.Builder()
                .url(url)
                .get()//默认就是GET请求,可以不写
                .build();
        Call call = okHttpClient.newCall(request);
        // 异步
//        call.enqueue(new Callback() {
//            @Override
//            public void onFailure(Call call, IOException e) {
//                System.out.println("onFailure");
//            }
//
//            @Override
//            public void onResponse(Call call, Response response) throws IOException {
//                System.out.println("onResponse");
//            }
//        });
        // 同步
        Response execute = call.execute();
        System.out.println(execute);
    }
<dependency>
   <groupId>com.squareup.okhttp3</groupId>
   <artifactId>okhttp</artifactId>
   <version>4.2.2</version>
</dependency>

 

5. FAQ

5.1 弱网

按照移动的特性来说,一般应用低于2G速率的都属于弱网,也可以将3G划分为弱网。除此之外,弱信号的Wifi通常也会被纳入到弱网测试场景中。

5.2 Thread.holdsLock()

检测一个线程是否有对象锁

5.3 同步方法调用时似乎只看到执行前入队,执行后出队

6. 参考资料

OkHttp中的Socket连接

扔掉okhttp、httpClient,来试试这款轻量级HTTP客户端神器?

看完这篇再摸不懂OkHttp,我跪搓衣板

 

OkHttp是一个开源的HTTP客户端库,用于在Android应用程序中进行网络请求。下面是一个使用OkHttp的应用实例: ```kotlin import okhttp3.Call import okhttp3.Callback import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import java.io.IOException class OkHttpManager(private val activity: Activity) { fun get(url: String) { val client = OkHttpClient() val request = Request.Builder().get().url(url).build() client.newCall(request).enqueue(object : Callback { override fun onFailure(call: Call, e: IOException) { ToastUtil.showToast(activity, "Get 失败") } override fun onResponse(call: Call, response: Response) { val responseStr = response.body()?.string() activity.runOnUiThread { ToastUtil.showToast(activity, responseStr) } } }) } } ``` 以上代码示例了如何使用OkHttp发送一个GET请求,并在响应返回后处理结果。其中,`OkHttpManager`是一个封装了OkHttp操作的类,`get`方法接收一个URL参数,创建一个GET请求,并异步执行。在响应返回时,通过回调方法处理成功或失败的情况,并在UI线程上显示响应结果。 请注意,这只是一个简单的示例,实际应用中可能还需要处理更多的错误和异常情况,以及其他类型的请求和响应。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [OkHttp日常使用实战篇](https://blog.csdn.net/sinat_35241409/article/details/118912417)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [OkHttp使用实例](https://blog.csdn.net/eieiei438/article/details/80062984)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值