封装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();//关闭对话框
}
}
封装OkHttp,通过改造Callback接口实现的更多相关文章
- 封装OkHttp,通过Callback改造Callback实现
1:实现Callback回调接口import android.os.Handler;import android.os.Looper;import android.os.Message;import ...
- 如何把 Callback 接口包装成 Promise 接口
最近一段时间一直在看Node.js,在开发过程中经常要调用一些异步接口,通常在接口的最后一个参数会传入一个回调函数,可以用来处理异常,非异常情况.大致模式如下: var fs = require(“f ...
- Thinkphp3.2.3框架下封装公共的函数,例如封装CURL函数来获取接口数据
当我们需要在控制层调用相同的封装函数时,写多次相同的函数,显得代码十分的拉杂,不精简: TP框架有一个很好的机制,可以再Common定义一个function.php函数,当我们在控制层调用的时候直接调 ...
- [开源] C# 封装 银海医保的接口
Github 地址: https://github.com/zifeiniu/YinHaiYiBaoCSharpAPI C#Model封装 银海医保的接口 介绍 银海医保的接口我就不说了,很多家医院在 ...
- python接口自动化(三十五)-封装与调用--流程类接口关联(详解)
简介 流程相关的接口,主要用 session 关联,如果写成函数(如上篇),s 参数每个函数都要带,每个函数多个参数,这时候封装成类会更方便.在这里我们还是以博客园为例,带着小伙伴们实践一下. 接口封 ...
- WebService如何封装XML请求 以及解析接口返回的XML
原 WebService如何封装XML请求 以及解析接口返回的XML 置顶 2019年08月16日 15:00:47 童子泛舟 阅读数 28 标签: XML解析WebService第三方API 更多 ...
- 工程化编程实战callback接口学习笔记
一.编译并运行 help.version命令执行正常,但quit命令出错 二.Debug 从命令输入到执行过程: 源代码: 更改后: 运行结果:能正确运行quit命令 Callback接口学习成果: ...
- 二次封装OKHttp网络框架(1)
1. 框架功能简介:暂时只有get.post两个请求 2. 请求的主要流程和区别: 2.1 get请求: (1)创建请求客户的 OkHttpClient对象 (2)创建请求构建器 Request.Bu ...
- 如何合理封装你的轮子、飞机、大炮(以封装OkHttp为例)
前言 对于程序员来说,很多时候,我们都在造房子,从学会框架或者是学会构建整个项目之后,慢慢的我们就会觉得自己在做的事情是一种重复劳动,很多时候只不过是换个面孔而已.而更快的造房子,造好看的房子可能是进 ...
随机推荐
- Jedis连接redis的一些基本操作
Jedis其实就是redis的一个连接方式 需要的jar包:
- close、flush、read、readline、seek、tell、truncate、write的使用
1.close关闭文件 f1= open("ha.log","r+",encoding="utf-8") data = f1.read() ...
- 使用ffmpeg转换视频格式
命令: ffmpeg -i infile -ab 128 -acodec libmp3lame -ac 1 -ar 22050 -r 29.97 -qscale 6 -y outfile 说明: ...
- HDU 6395(2018多校第7场1010)Sequence
不久前做过POJ3070,所以知道这题要用矩阵快速幂优化,但是这个题的递推公式中有一项⌊p/n⌋,场上就不会了... 下来才知道要用分块矩阵快速幂,因为⌊p/n⌋最多有2√p块,可以对每一块使用快速幂 ...
- Tensorflow手写数字识别训练(梯度下降法)
# coding: utf-8 import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data #p ...
- varnish安装
安装pcrevarnish 依赖pcre进行url正则匹配. cd pcre-8.12./configure --prefix=/usr/local/make&&make instal ...
- poj3171 Cleaning Shifts
传送门 题目大意 有一个大区间和n个小区间,每个小区间都有一个代价,求最少付出多少代价可以使得小区间完全覆盖大区间. 分析为了方便起见我们先将s变为2,其它的位置都对应更改以便后期处理.我们考虑以t1 ...
- STM32 CAN控制器简介
1.STM32自带了基本扩展CAN外设,又称bxCAN,bxCAN的特点如下: 2.模式:分为工作模式.测试模式.调试模式 睡眠模式主要用于降低功耗! 在静默模式下的工作原理 由图可知,它只会接受来自 ...
- Batch Normalization参考博客
https://blog.csdn.net/whitesilence/article/details/75667002 https://blog.csdn.net/malefactor/article ...
- 《Effective Java》第6章 枚举和注解
第30条:用enum代替int常量 将加班工资计算移到一个私有的嵌套枚举中,将这个策略枚举(strategy enum)的实例传到PayrollDay枚举的构造器中.之后PayrollDay枚举将加班 ...