封装前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");
}
}點(diǎn)擊查看更多內(nèi)容
為 TA 點(diǎn)贊
評(píng)論
評(píng)論
共同學(xué)習(xí),寫(xiě)下你的評(píng)論
評(píng)論加載中...
作者其他優(yōu)質(zhì)文章
正在加載中
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開(kāi)微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得
100積分直接送
付費(fèi)專(zhuān)欄免費(fèi)學(xué)
大額優(yōu)惠券免費(fèi)領(lǐng)


