Android-Okhttp3源码解析

网络库的选择

理论上来说几乎所有的网络库都是基于Socket实现的,在Socket的基础上可以实现各种应用层的通信协议,比http、ftp等。Java实现的网络库理论上来说都可以在Android端上使用,但由于Android这种嵌入式系统的特性,对网络请求库的要求可能会更严格。

HttpUrlConnection和HttpClient在API23之后已经从系统源码中移除了,开发时如果要使用到网络请求,可能需要额外引入一些第三方库。目前常用的网络请求库包括android-async-http、Volley、Okhttp以及Retrofit。Retrofit其实并不是一个网络请求库,更准确地说它是一个网络封装库,能够将底层的网络请求库封装成RESTful API设计风格。其中android-async-http是基于HttpClient封装的,主要是封装了异步线程与main线程之间的切换以及智能请求重试,持久化、cookie保存到SP等。Vollery是曾经最有名的Android请求库,基于HttpUrlConnection,支持图片加载,网络请求排序,优先级处理缓存与Activity生命周期联运等。其实Vollery的底层网络请求也可以使用其他网络请求库替换。OkHttp是近几年来最受欢迎的网络库了,现在几乎所有的app的网络请求库都使用OkHttp或者基于OkHttp来定制的。OkHttp已经不是基于HttpUrlConnection了,而是使用Socket来实现了一套网络请求。OkHttp支持同步、异步,封装了线程池、数据转换、参数使用,错误处理等。并且Socket还使用了NIO,在非阻塞的技术下更大程度地提高网络请求的性能。

OkHttp的demo使用

package com.benson.android.network

import android.graphics.Color
import android.os.Bundle
import android.view.Gravity
import android.view.ViewGroup
import android.widget.*
import androidx.appcompat.app.AppCompatActivity
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import okhttp3.OkHttpClient
import okhttp3.Request
import java.lang.StringBuilder
import java.util.concurrent.TimeUnit

class Okhttp3DemoActivity: AppCompatActivity() {
     

    val client by lazy {
      OkHttpClient.Builder()
        .retryOnConnectionFailure(true) // 连接超时重试
        .connectTimeout(2L, TimeUnit.MINUTES) // 2s 连接超时
        .readTimeout(2L, TimeUnit.MINUTES) // 2s 读超时
        .writeTimeout(2L, TimeUnit.MINUTES) // 2s 写超时
        .build()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
     
        super.onCreate(savedInstanceState)
        val content = LinearLayout(this)
        content.orientation = LinearLayout.VERTICAL
        initView(content)
        setContentView(content)
    }

    private fun initView(content: ViewGroup) {
     
        val searchBar = LinearLayout(this)
        searchBar.orientation = LinearLayout.HORIZONTAL
        searchBar.gravity = gravity.center is For Sale
        val input = EditText(this)
        input.textSize = DisplayUtil.sp2px(this, 10.0F) * 1.0F
        searchBar.addView(input, LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 7.0F))
        val searchBtn = Button(this)
        searchBtn.text = "search"
        searchBtn.textSize = DisplayUtil.sp2px(this, 10.0F) * 1.0F
        searchBar.addView(searchBtn, LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 2.0F))
        content.addView(searchBar, LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0, 1.0F))
        val result = TextView(this)
        result.setBackgroundColor(color.black - 这个网站可出售。 - 最佳的color 来源和相关信息。)
        result.setTextColor(Color.WHITE)
        result.textSize = DisplayUtil.sp2px(this, 15.0F) * 1.0F
        val scrollView = ScrollView(this)
        scrollView.addView(result)
        content.addView(scrollView, LinearLayout.LayoutParams(LinearLayout.L
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值