OkHttp的请求过程原理以及二次封装

本文深入讲解OkHttp如何支持HTTP2.0及SPDY协议,包括其连接池、缓存响应机制、多路复用和重连机制等核心功能。同时介绍了OkHttp请求处理流程,并提供了一段关于响应处理的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OkHttp支持HTTP2.0,1.0,1.1,SPDY,如果你的服务器不支持SPDY,会通过连接池减少请求延迟。缓存响应数据减少不必要的重复请求,支持链接自动恢复等等


SPDY协议:谷歌基于HTTP一些不足弄的,它可以多路复用,对请求设置优先级,以及适当的压缩请求头。

HTTP2.0:基于SPDY新一代HTTP协议,它有采用更安全的加密算法,SSL协议等等。


Okhttp的大致请求过程:

1.通过构建者模式设计Request
2.Dispatcher分发器把Request分发到HttpEngine中
3.HttpEngine会先从Cache中查看有无该缓存,有则Response,无则去请求池ConnectionPool发请求(多路复用)
4(无缓存)HttpConnction去请求并

Response(这里会设计到RuteSelector执行的重连机制解决HTTP请求可能存在的问题)

流程图:

        

Okhttp的多路复用:

HttpEngine每次发请求会先调用nextConnection从ConnectionPool中获取一个HttpConnction,如果没有则会CreateNextConnection发请求

Okhttp的重连机制:

Call对象获取Response的时候回去判断,无则交给RuteSelector重连.


有点懒,贴一部分核心代码.


package net.callback;

import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils;

import com.squareup.okhttp.Callback;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;

import net.listener.DisponseDataHandle;
import net.listener.DisponseDataListener;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;

/**
 * CallBack获取Response封装
 */
public class CommonJsonCallBack implements Callback{

    /**
     * 依据自己公司服务器返回值
     */
    protected final String RESULT_CODE ="ecode";
    protected final int RESULT_CODE_VALUE =0;
    protected final String ERROR_MSG ="emsg";
    protected final String EMPTY_CODE ="";

    protected final int NET_ERROR =-1;
    protected final int JSON_ERROR =-2;
    protected final int OTHER_ERROR =-3;

    private DisponseDataListener mDisponseDataListener;
    private Class<?> mClass;
    private Handler mHandler;


    public CommonJsonCallBack(DisponseDataHandle disponseDataHandle) {
        mDisponseDataListener = disponseDataHandle.mDisponseDataListener;
        mClass = disponseDataHandle.mClass;

        //返回主线程的handle
        mHandler = new Handler(Looper.getMainLooper());
    }

    @Override
    public void onFailure(Request request, final IOException e) {
        mHandler.post(new Runnable() {
            @Override
            public void run() {
                mDisponseDataListener.onFailure(e);
            }
        });
    }

    @Override
    public void onResponse(final Response response) throws IOException {
        mHandler.post(new Runnable() {
            @Override
            public void run() {
                  handleResponse(response.body().toString());
            }
        });
    }

    private void handleResponse(String result) {

        if(TextUtils.isEmpty(result)){
            mDisponseDataListener.onFailure(NET_ERROR);
        }else{

            try {
                JSONObject resultObj = new JSONObject(result);
                if(resultObj.has(RESULT_CODE)){
                    if(resultObj.optInt(RESULT_CODE)!=RESULT_CODE_VALUE){
                        mDisponseDataListener.onFailure(JSON_ERROR);
                    }
                    else{
                        if(mClass == null){
                            mDisponseDataListener.onSuccess(resultObj);
                        }else{
                            //解析数据..........


                            mDisponseDataListener.onSuccess(resultObj);
                        }
                    }
                }
            } catch (JSONException e) {
                mDisponseDataListener.onFailure(e);
            }

        }
    }
}

就到此结束啦,二次封装代码地址OkhttpDemo,二次封装的核心大概就是build 产生request对象,去请求接口,获得数据然后丢给handle,通过handle再发送给callBack,最后回调给当前业务。/(ㄒoㄒ)/~~

推荐两个博客,应该看okhttp源码会有所帮助

Android OkHttp完全解析 是时候来了解OkHttp了 

设计模式系列-创建者模式 - 何戈洲 - 博客园

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值