欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-03 20:41:46
...

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的请求过程原理以及二次封装

Okhttp的多路复用:

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

Okhttp的重连机制:

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

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

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


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了 

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