封装OkHttp,通过Callback改造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改造Callback实现的更多相关文章
- 封装OkHttp,通过改造Callback接口实现
1:实现Callback回调接口import android.os.Handler;import android.os.Looper;import android.os.Message; import ...
- 二次封装OKHttp网络框架(1)
1. 框架功能简介:暂时只有get.post两个请求 2. 请求的主要流程和区别: 2.1 get请求: (1)创建请求客户的 OkHttpClient对象 (2)创建请求构建器 Request.Bu ...
- 如何合理封装你的轮子、飞机、大炮(以封装OkHttp为例)
前言 对于程序员来说,很多时候,我们都在造房子,从学会框架或者是学会构建整个项目之后,慢慢的我们就会觉得自己在做的事情是一种重复劳动,很多时候只不过是换个面孔而已.而更快的造房子,造好看的房子可能是进 ...
- Python 爬取的类封装【将来可能会改造,持续更新...】(2020年寒假小目标09)
日期:2020.02.09 博客期:148 星期日 按照要求,我来制作 Python 对外爬取类的固定部分的封装,以后在用 Python 做爬取的时候,可以直接使用此类并定义一个新函数来处理CSS选择 ...
- Android -- OkHttp的简单使用和封装
1,昨天把okHttp仔细的看了一下,以前都是调用同事封装好了的网络框架,直接使用很容易,但自己封装却不是那么简单,还好,今天就来自我救赎一把,就和大家写写从最基础的OKHttp的简单get.post ...
- Android 一个改进的okHttp封装库
一.概述 之前写了篇Android OkHttp完全解析 是时候来了解OkHttp了,其实主要是作为okhttp的普及文章,当然里面也简单封装了工具类,没想到关注和使用的人还挺多的,由于这股热情,该工 ...
- Android 一个改善的okHttp封装库
膜拜一下~ 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/49734867: 本文出自:[张鸿洋的博客] 一.概述 之前写了篇A ...
- okhttp +fastJson 在UI层的回调封装
一直使用OkHttp 经常烦人的地方是回调方法 数据解析后必须通过handler 在主线程做操作 网上找了很多资料 发现有些都是基于Gson做的解析 fastJson 在封装时 泛型传入会有很多不方 ...
- OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据
OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据 我们这片博文就来聊聊这个反响很不错的OkHttp了,标题是我恶搞的,本篇将着重详细的 ...
随机推荐
- jQuery源码学习(2):选择器初窥
选择器初窥 代码架构: jQuery选择器可以依照传入数据的类型分为五大类: 传入字符串:$("div"), $("#id"), $(".div1&q ...
- datalog
https://en.wikipedia.org/wiki/Datalog http://www.csd.uoc.gr/~hy562/1112_spring/instr_material/WhatYo ...
- UVa 10400 - Game Show Math
题目大意:给出n(n<100)个正整数和一个目标数,按照给出数的顺序,运用+.-.*./四则运算(不考虑优先级),判断能否得出所要的结果. 首先考虑的就是暴力枚举,不过时间复杂度为O(4n),会 ...
- Core Data使用之一(Swift): 保存
Core Data 用于永久化数据,它是基于SQLite数据库的保存一门技术. 那么,在Swift中,它是如何实现的呢? 首先,需要新建一个模板,打开工程中的xcdatamodeld文件,点击“Add ...
- iOS 之 Strong与Weak,_unsafe _unretained与weak区别
1. 在ARC中 strong(强引用) 相当于retain, weak(弱引用) 相当于assign.ARC下,strong告诉编译器自动插入retain.但是在ARC下,代理协议的属性依然用ass ...
- PHPcms 把盛大登陆换成人人网登陆
首先要确保你的 phpcms是比较新的版本, v9.3以后的吧 这里说明一个函数 rawurlencode() 本函数将字符串编码成 URL 的字符串专用格式,特殊的字符会转换成百分比符号后面加上二个 ...
- 建立、配置和使用Activity——启动其他Activity并返回结果
Activity还提供了一个startActivityForResult(Intent intent,int requestCode)方法来启动其他Activity.该方法用于启动指定Activity ...
- 第6组UI组件:ViewAnimator及其子类
ViewAnimator是一个基类,它继承了FrameLayout,因此它表现出FrameLayout的特征,可以将多个View组件“叠”在一起.ViewAnimator额外增加的功能正如它的名字所暗 ...
- Java 原型模式
http://www.cnblogs.com/itTeacher/archive/2012/12/02/2797857.html http://www.cnblogs.com/java-my-life ...
- iOS 环信消息撤回
这两天在做环信的消息回撤,在网上找了许久没有这种案例,之后官方的一些方法,但是自己做,还是需要花点时间去整理,所以我决定等我把这个做好之后,分享给大家,如果做的不好多多指教,谢谢- 首先要实现消息撤回 ...