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();//关闭对话框
}
}
												

封装OkHttp,通过改造Callback接口实现的更多相关文章

  1. 封装OkHttp,通过Callback改造Callback实现

    1:实现Callback回调接口import android.os.Handler;import android.os.Looper;import android.os.Message;import ...

  2. 如何把 Callback 接口包装成 Promise 接口

    最近一段时间一直在看Node.js,在开发过程中经常要调用一些异步接口,通常在接口的最后一个参数会传入一个回调函数,可以用来处理异常,非异常情况.大致模式如下: var fs = require(“f ...

  3. Thinkphp3.2.3框架下封装公共的函数,例如封装CURL函数来获取接口数据

    当我们需要在控制层调用相同的封装函数时,写多次相同的函数,显得代码十分的拉杂,不精简: TP框架有一个很好的机制,可以再Common定义一个function.php函数,当我们在控制层调用的时候直接调 ...

  4. [开源] C# 封装 银海医保的接口

    Github 地址: https://github.com/zifeiniu/YinHaiYiBaoCSharpAPI C#Model封装 银海医保的接口 介绍 银海医保的接口我就不说了,很多家医院在 ...

  5. python接口自动化(三十五)-封装与调用--流程类接口关联(详解)

    简介 流程相关的接口,主要用 session 关联,如果写成函数(如上篇),s 参数每个函数都要带,每个函数多个参数,这时候封装成类会更方便.在这里我们还是以博客园为例,带着小伙伴们实践一下. 接口封 ...

  6. WebService如何封装XML请求 以及解析接口返回的XML

    原 WebService如何封装XML请求 以及解析接口返回的XML 置顶 2019年08月16日 15:00:47 童子泛舟 阅读数 28 标签: XML解析WebService第三方API 更多 ...

  7. 工程化编程实战callback接口学习笔记

    一.编译并运行 help.version命令执行正常,但quit命令出错 二.Debug 从命令输入到执行过程: 源代码: 更改后: 运行结果:能正确运行quit命令 Callback接口学习成果: ...

  8. 二次封装OKHttp网络框架(1)

    1. 框架功能简介:暂时只有get.post两个请求 2. 请求的主要流程和区别: 2.1 get请求: (1)创建请求客户的 OkHttpClient对象 (2)创建请求构建器 Request.Bu ...

  9. 如何合理封装你的轮子、飞机、大炮(以封装OkHttp为例)

    前言 对于程序员来说,很多时候,我们都在造房子,从学会框架或者是学会构建整个项目之后,慢慢的我们就会觉得自己在做的事情是一种重复劳动,很多时候只不过是换个面孔而已.而更快的造房子,造好看的房子可能是进 ...

随机推荐

  1. Oracle之DBMS_SQL包用法详解

    对于一般的(select)操作,如果使用动态的sql语句则需要进行以下几个步骤:open  cursor--->parse---> bind  variable  ---> defi ...

  2. C#简单的图片合成及防止并发的办法

    /// <summary> /// 合成图 /// </summary> private string ComposeCarBrandBadImage(AnonAttachme ...

  3. Arduino Serial库的使用

    1 Serial.begin() 2 Serial.end() 3 Serial.available() 4 Serial.read() 5 Serial.peek() 6 Serial.flush( ...

  4. Luogu 4197 Peaks

    BZOJ 3545 带权限. 考虑离线,把所有边按照从小到大的顺序排序,把所有询问也按照从小到大的顺序排序,然后维护一个并查集和一个权值线段树,每处理一个询问就把比这个询问的$x$更小的边连上,具体来 ...

  5. 数据库commit问题

    对数据库进行修改后,需要commit!---之前也是忘记commit导致数据库反应不过来.

  6. java 的exception throw try catch

    import java.util.*; public class MyException extends Exception { private static final Exception Exce ...

  7. C#中的线程池使用(一)

    1  线程池的概念 许多应用程序使用多个线程,但这些线程经常在休眠状态中耗费大量的时间来等待事件发生.其他线程可能进入休眠状态,并且仅定期被唤醒以轮询更改或更新状态信息,然后再次进入休眠状态.为了简化 ...

  8. [Spring Boot]Request method 'GET' not supported

    在网上查了些资料没有解决,检查代码发现 @PostMapping public String add(Employee employee){ System.out.println(employee); ...

  9. [SinGuLaRiTy] NOIP 膜你赛-Day 2

    [SinGuLaRiTy-1031] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 对于所有题目: Time Limit: 1s | Mem ...

  10. CI框架源码学习笔记2——Common.php

    上一节我们最后说到了CodeIgniter.php,可是这一节的标题是Common.php,有的朋友可能会觉得很奇怪.事实上,CodeIgniter.php其实包含了ci框架启动的整个流程. 里面引入 ...