为了账号安全,请及时绑定邮箱和手机立即绑定

简洁封装okHttp3

标签:
Android

封装前okhttp的流程.下面是一个post代码和流程图:

private void useOkHttpSendRequest() {
    OkHttpClient client = new OkHttpClient();
    RequestBody body = new FormBody.Builder()
            .add("bookDescription",mDescriptionEdit.getText().toString())
            .add("bookName",mBookNameEdit.getText().toString()).build();

    final Request request = new Request.Builder()
            .url(UrlConstant.URL)
            .post(body).build();
    Call call = client.newCall(request);
    call.enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            Log.d(TAG,"<<<<e="+e);

        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            if(response.isSuccessful()) {
                String d = response.body().string();
                mBookName.post(new Runnable() {
                    @Override
                    public void run() {
                        finish();
                    }
                });
                Log.d(TAG,"<<<<d="+d);
            }
        }
    });
}

https://img1.sycdn.imooc.com//5c340ac90001318e10200890.jpg

这个代码的问题是:

1、代码冗余,而且不能支持每个请求都自动加入公共参数;2:如果官方的api发生了更新,那么你每个网络请求的地方都要修改,这就有点得不偿失了;3:网络请求的逻辑全都暴露在了Activity里面,这肯定是不允许的

封装的思路是:

https://img1.sycdn.imooc.com//5c340bb80001e77104420263.jpg


封装的好处是:

https://img1.sycdn.imooc.com//5c340bd200018a3912880670.jpg

怎么封装呢:首先封装callback:

public abstract class OkHttpCallback implements Callback {


    public abstract void onSuccess(final Call call, JSONObject response);


    protected final void onSuccess(final Call call, Response response) throws Throwable {
        String responseStr = response.body().string().trim();
        JSONObject responseObject = (JSONObject)new JSONTokener(responseStr).nextValue();
        if (responseObject != null) {
            onSuccess(call, responseObject);
        } else {
            onFailure(call,null);
        }
    }

    @Override
    public final void onResponse(Call call, Response response){
        if (response != null) {
            try {
                if (response.isSuccessful()) {
                    onSuccess(call, response);
                } else {
                    onFailure(call, null);
                }
            } catch (Throwable e) {
                onFailure(call, null);
            }
        } else {
            onFailure(call, null);
        }
    }


}

然后是封装okhttp核心类:

public class OkHttpUtil {

    private static OkHttpClient mOkHttpClient = null;

    public static void init() {
        if (mOkHttpClient == null) {
            OkHttpClient.Builder clientBuilder = new OkHttpClient()
                    .newBuilder()
                    .connectTimeout(5000, TimeUnit.MILLISECONDS)
                    .readTimeout(5000, TimeUnit.MILLISECONDS)
                    .writeTimeout(5000, TimeUnit.MILLISECONDS);
            mOkHttpClient = clientBuilder.build();
        }
    }


    public static void get(String url, OkHttpCallback okHttpCallback) {
        Call call = null;
        Callback callback = okHttpCallback;
        try {
            Request request =  new Request.Builder().url(url).build();
            call = mOkHttpClient.newCall(request);
            call.enqueue(callback);
        } catch (Throwable e) {
            e.printStackTrace();
            callback.onFailure(call, new IOException("get", e));
        }
    }

}

封装请求的基类:

public abstract class ApiUtil {

    /**
     * 状态码
     */
    private String mStatus = "";

    /**
     * 上下文
     */
    private Context mContext = null;

    /**
     * API发送监听
     */
    private ApiListener mApiListener = null;


    /**
     * 发送监听
     */
    private OkHttpCallback mSendListener = new OkHttpCallback() {

        @Override
        public void onSuccess(Call call, JSONObject response) {
            if (null != response) {
                mStatus = response.optString("status");

                if (isSuccess()) {
                    try {
                        parseData(response);
                        if (null != mApiListener) {
                            mApiListener.success(ApiUtil.this);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }else {
                    if (null != mApiListener) {
                        mApiListener.failure(ApiUtil.this);
                    }
                }
            }
        }

        @Override
        public void onFailure(Call call, IOException e) {
            if (null != mApiListener) {
                mApiListener.failure(ApiUtil.this);
            }
        }

    };

    /**
     * http get
     *
     * @param context           :上下文
     * @param listener          :发送回调
     */
    public void get(Context context, ApiListener listener) {
        mContext = context;
        mApiListener = listener;
        if (Util.hasNetwork(mContext)) {
            OkHttpUtil.get(getUrl(), mSendListener);
        }
    }



    public boolean isSuccess() {
        boolean result = false;
        if (("success".equalsIgnoreCase(mStatus)) || ("0".equals(mStatus) || ("200".equals(mStatus)))){
            result = true;
        }
        return result;
    }


    /**
     * 获取url
     * @return:http链接url
     */
    protected abstract String getUrl();


    /**
     * 解析数据
     *
     * @param jsonObject
     */
    protected abstract void parseData(JSONObject jsonObject) throws Exception;


}

然后请求是:

public class TestGetBookApi extends ApiUtil {

    public String mData;

    @Override
    protected String getUrl() {
        return IP +"/api/v1/books";

    }

    @Override
    protected  void parseData(JSONObject jsonObject) throws Exception {
        mData = jsonObject.optString("data");
    }
}


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消