OkHttp是一个用于Android和Java应用的高效HTTP客户端库。它具有以下优点:
优点
- 高效连接池:
- 支持连接复用(Connection Pooling)减少延迟。
- 有效管理HTTP/2多路复用。
- 透明压缩:
- 自动处理Gzip压缩,减少传输的数据量。
- 缓存响应:
- 内置缓存机制,帮助减少不必要的网络调用,提高速度和节省流量。
- 异步请求:
- 支持异步请求,避免阻塞主线程,提高应用响应速度。
- 支持WebSocket:
- 提供WebSocket支持,便于实时通信。
- 安全性:
- 支持TLS加密,确保数据传输的安全性。
- 易于集成和使用:
- 简单的API设计,方便与其他库(如Retrofit)集成。
简单使用
- 依赖
implementation("com.squareup.okhttp3:okhttp:4.9.3")implementation("com.google.code.gson:gson:2.8.8")
- 定义json转换的对象
data class ImageData(val createTime: Long,val id: Long,val name: String,val path: String,val size: Long
)data class ApiResponse(val data: List<ImageData>,val errorCode: Int,val isSuccess: Boolean
)
- 直接调用即可,主要在接收到后使用Gson反序列化。
class OkHttpActivity : AppCompatActivity() {private lateinit var binding: ActivityOkHttpBindingoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)binding = ActivityOkHttpBinding.inflate(layoutInflater)setContentView(binding.root)binding.recyclerView.layoutManager = LinearLayoutManager(this)fetchData()}private fun fetchData() {val client = OkHttpClient()val request = Request.Builder().url("http://192.168.42.7:9876/image/listImage?page=0&pageSize=100").build()client.newCall(request).enqueue(object : okhttp3.Callback {override fun onFailure(call: okhttp3.Call, e: IOException) {e.printStackTrace()}override fun onResponse(call: okhttp3.Call, response: okhttp3.Response) {response.body?.string()?.let { jsonString ->val apiResponse = Gson().fromJson(jsonString, ApiResponse::class.java)runOnUiThread {binding.recyclerView.adapter = ImageAdapter(apiResponse.data)}}}})}
}
效果
原理
okhttp(传输层)
- Deque(双端队列)
- running队列数量<64,并且同时访问同一个host数量<5,就直接加入running队列,否则则加入等待队列
- 基于第二点,所以线程池不设置等待队列,使用SynchronousQueue无容量队列
- 构建者模式,责任链模式
- connectInteceptor创建socket请求
- ConnectionPool,设置线程池为守护线程
- 避免阻止 JVM 正常退出。
- 更高效地管理后台任务和连接。
- 自动清理资源,防止资源泄漏。
- promoteCalls执行下一个任务