封装前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); } } }); }
这个代码的问题是:
1、代码冗余,而且不能支持每个请求都自动加入公共参数;2:如果官方的api发生了更新,那么你每个网络请求的地方都要修改,这就有点得不偿失了;3:网络请求的逻辑全都暴露在了Activity里面,这肯定是不允许的
封装的思路是:
封装的好处是:
怎么封装呢:首先封装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 点赞
0 评论
共同学习,写下你的评论
暂无评论
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦