封裝OkHttp,通過改造Callback接口實現


1:實現Callback回調接口
import android.os.Handler;
import android.os.Looper;
import android.os.Message;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;

/**
* 封裝了OkCallback的處理 2016 - 10 - 14
*
* @param <ResponseResult> 請求成功的返回值類型
* @param <FailResult> 請求失敗的返回值類型
*/
public abstract class OkHttpCallback<ResponseResult, FailResult>
implements Callback {

/**
* 請求失敗標志
*/
public static final int FAIL = -1;

/**
* 請求取消標志
*/
public static final int CANCEL = 0;

/**
* 請求成功標志
*/
public static final int SUCCESS = 1;


private static final int MESSAGE_POST_SUCCESS = 0x1;

private static final int MESSAGE_POST_FAILE = 0x2;

/**
* 請求失敗
*
* @param call Call
* @param e IOException
* @return FailResult請求失敗的結果
*/
public abstract FailResult onThreadFailure(Call call, IOException e);

/**
* 請求成功,此處對請求結果進行處理
*
* @param call Call
* @param response 處理的結果
* @return ResponseResult 對Response處理后的結果
* @throws IOException
*/
public abstract ResponseResult onThreadResponse(Call call, Response response)
throws IOException;

/**
* 請求失敗處理的結果,Run main thread
*
* @param isCancel 請求是否被取消
* @param result 請求失敗處理的結果
*/
protected void onFailResult(boolean isCancel, FailResult result) {

}

/**
* 請求成功處理的結果,Run main thread
*
* @param result 請求成功處理后的結果
*/
protected void onResponseResult(ResponseResult result) {

}

/**
* 在onFailResult 或 onResponseResult 方法之后執行
*/
protected void onFinally () {

}

@Override
public void onFailure(Call call, final IOException e) {
FailResult result = onThreadFailure(call, e);
Message message = getHandler().obtainMessage(MESSAGE_POST_FAILE,
new MyOkHttpExecuteTaskResult<FailResult>(call, this, result));
message.sendToTarget();
}

@Override
public void onResponse(Call call, final Response response)
throws IOException {
ResponseResult result = onThreadResponse(call, response);
Message message = getHandler().obtainMessage(MESSAGE_POST_SUCCESS, new MyOkHttpExecuteTaskResult<ResponseResult>(call, this, result)); message.sendToTarget(); }
private static InternalHandler sHandler;
private static Handler getHandler() {
synchronized (OkHttpCallback.class) {
if (sHandler == null) {
sHandler = new InternalHandler();
}
return sHandler;
}
}
private static class MyOkHttpExecuteTaskResult<Result> {
@SuppressWarnings("rawtypes")
final OkHttpCallback mTask;
final Result mData;
final Call mCall;
public MyOkHttpExecuteTaskResult(Call call, OkHttpCallback task,
Result data) {
mCall = call;
mTask = task;
mData = data;
}
}
private static class InternalHandler extends Handler {
public InternalHandler() {
super(Looper.getMainLooper());
}
@SuppressWarnings("unchecked")
@Override
public void handleMessage(Message msg) {
MyOkHttpExecuteTaskResult<?> result = (MyOkHttpExecuteTaskResult<?>) msg.obj;
switch (msg.what) {
case MESSAGE_POST_SUCCESS:
result.mTask.onResponseResult(result.mData);
break;
case MESSAGE_POST_FAILE:
result.mTask.onFailResult(result.mCall.isCanceled(), result.mData);
break;
}
result.mTask.onFinally();
}
}
}

2:使用
new OkHttpCallback<String, Void>() {

@Override
public Void onThreadFailure(Call call, IOException e) {
return null;
}

@Override
public String onThreadResponse(Call call, Response response) throws IOException {
return response.body().string();
}

@Override
protected void onResponseResult(String s) {
i(TAG, s);
LoginResponseBean responseBean;
try {
responseBean = GsonUtils.getInstance().j2O(s, LoginResponseBean.class);
} catch (Exception e) {
e.printStackTrace();
showToastShort(R.string.toast_response_fail);
dismissMDialog();
return;
}
if (responseBean.isRequestSuccessed()) {
getMyApplication().setCurrentUserInfo(responseBean.getResult());
// 保存用戶名和密碼
putString(SPKey.KEY_USERNAME, et_login_username.getText().toString().trim());
if (isAutoLogin)
putString(SPKey.KEY_PASSWORD, et_login_password.getText().toString().trim());
// 獲取更多用戶信息
getUserMoreInfo();
} else {
showToastShort(responseBean.getMessage());
dismissMDialog();
}
}

@Override
protected void onFailResult(boolean isCancel, Void aVoid) {
if (isCancel) {
showToastShort(R.string.toast_login_cancel);
} else {
showToastShort(R.string.toast_login_fail);
}
}

@Override
protected void onFinally() {
btn_login.setEnabled(true);
loginCall = null;
     dismisMDialog();//關閉對話框

}
}
 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM