封装OKHttp
来源:互联网 发布:黑暗风格数据地图 编辑:程序博客网 时间:2024/05/21 15:02
如果不封装OKHttp,则每发出一个请求,都要写很多重复代码,是无用且繁琐的,所以必须要封装,并且若能够结合GSON,将返回的json数据直接解析为Bean对象,就可以大大简化网络请求过程;更进一步,若能在每个请求都加上进度对话框的功能,就大大美化了网络请求过程。下面开始封装:
①构建OKHttpHelper类
->OKHttpHelper应该是单例的
private static OkHttpHelper mInstance;
static {
mInstance = new OkHttpHelper();
}
private OkHttpHelper(){
mHttpClient = new OkHttpClient();
mHttpClient.setConnectTimeout(10, TimeUnit.SECONDS);
mHttpClient.setReadTimeout(10,TimeUnit.SECONDS);
mHttpClient.setWriteTimeout(30,TimeUnit.SECONDS);
mGson = new Gson();
mHandler = new Handler(Looper.getMainLooper());
};
public static OkHttpHelper getInstance(){
return mInstance;
}
->实现request方法
public void request(final Request request,final BaseCallback callback){
callback.onBeforeRequest(request);
mHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
callbackFailure(callback, request, e);
}
@Override
public void onResponse(Response response) throws IOException {
callbackResponse(callback,response);
if(response.isSuccessful()) {
String resultStr = response.body().string();
if (callback.mType == String.class){
callbackSuccess(callback,response,resultStr);
}
else {
try {
Object obj = mGson.fromJson(resultStr, callback.mType);
callbackSuccess(callback,response,obj);
}
catch (com.google.gson.JsonParseException e){ // Json解析的错误
callback.onError(response,response.code(),e);
}
}
}
else if(response.code() == TOKEN_ERROR||response.code() == TOKEN_EXPIRE ||response.code() == TOKEN_MISSING ){
callbackTokenError(callback,response);
}else {
callbackError(callback,response,null);
}
}
});
}
}
private void callbackTokenError(final BaseCallback callback , final Response response ){
mHandler.post(new Runnable() {
@Override
public void run() {
callback.onTokenError(response,response.code());
}
});
private void callbackSuccess(final BaseCallback callback , final Response response, final Object obj ){
mHandler.post(new Runnable() {
@Override
public void run() {
callback.onSuccess(response, obj);
}
});
}
private void callbackError(final BaseCallback callback , final Response response, final Exception e ){
mHandler.post(new Runnable() {
@Override
public void run() {
callback.onError(response,response.code(),e);
}
});
}
private void callbackFailure(final BaseCallback callback , final Request request, final IOException e ){
mHandler.post(new Runnable() {
@Override
public void run() {
callback.onFailure(request,e);
}
});
private void callbackResponse(final BaseCallback callback , final Response response ){
mHandler.post(new Runnable() {
@Override
public void run() {
callback.onResponse(response);
}
});
}
->处理GET请求的方法
public void get(String url,Map<String,Object> param,BaseCallback callback){
Request request = buildGetRequest(url,param);
request(request,callback);
}
public void get(String url,BaseCallback callback){
get(url,null,callback);
}
public void post(String url,Map<String,Object> param, BaseCallback callback){
Request request = buildPostRequest(url,param);
request(request,callback);
}
->处理POST请求的方法
public void post(String url,Map<String,Object> param, BaseCallback callback){
Request request = buildPostRequest(url,param);
request(request,callback);
}
->构建请求的几个方法
具体实现:
public class OkHttpHelper {
public static final int TOKEN_MISSING=401;// token 丢失
public static final int TOKEN_ERROR=402; // token 错误
public static final int TOKEN_EXPIRE=403; // token 过期
public static final String TAG="OkHttpHelper";
private static OkHttpHelper mInstance;
private OkHttpClient mHttpClient;
private Gson mGson;
private Handler mHandler;
static {
mInstance = new OkHttpHelper();
}
private OkHttpHelper(){
mHttpClient = new OkHttpClient();
mHttpClient.setConnectTimeout(10, TimeUnit.SECONDS);
mHttpClient.setReadTimeout(10,TimeUnit.SECONDS);
mHttpClient.setWriteTimeout(30,TimeUnit.SECONDS);
mGson = new Gson();
mHandler = new Handler(Looper.getMainLooper());
};
public static OkHttpHelper getInstance(){
return mInstance;
}
public void get(String url,Map<String,Object> param,BaseCallback callback){
Request request = buildGetRequest(url,param);
request(request,callback);
}
public void get(String url,BaseCallback callback){
get(url,null,callback);
}
public void post(String url,Map<String,Object> param, BaseCallback callback){
Request request = buildPostRequest(url,param);
request(request,callback);
}
public void request(final Request request,final BaseCallback callback){
callback.onBeforeRequest(request);
mHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
callbackFailure(callback, request, e);
}
@Override
public void onResponse(Response response) throws IOException {
// callback.onResponse(response);
callbackResponse(callback,response);
if(response.isSuccessful()) {
String resultStr = response.body().string();
Log.d(TAG, "result=" + resultStr);
if (callback.mType == String.class){
callbackSuccess(callback,response,resultStr);
}
else {
try {
Object obj = mGson.fromJson(resultStr, callback.mType);
callbackSuccess(callback,response,obj);
}
catch (com.google.gson.JsonParseException e){ // Json解析的错误
callback.onError(response,response.code(),e);
}
}
}
else if(response.code() == TOKEN_ERROR||response.code() == TOKEN_EXPIRE ||response.code() == TOKEN_MISSING ){
callbackTokenError(callback,response);
}
else {
callbackError(callback,response,null);
}
}
});
}
private void callbackTokenError(final BaseCallback callback , final Response response ){
mHandler.post(new Runnable() {
@Override
public void run() {
callback.onTokenError(response,response.code());
}
});
}
private void callbackSuccess(final BaseCallback callback , final Response response, final Object obj ){
mHandler.post(new Runnable() {
@Override
public void run() {
callback.onSuccess(response, obj);
}
});
}
private void callbackError(final BaseCallback callback , final Response response, final Exception e ){
mHandler.post(new Runnable() {
@Override
public void run() {
callback.onError(response,response.code(),e);
}
});
}
private void callbackFailure(final BaseCallback callback , final Request request, final IOException e ){
mHandler.post(new Runnable() {
@Override
public void run() {
callback.onFailure(request,e);
}
});
}
private void callbackResponse(final BaseCallback callback , final Response response ){
mHandler.post(new Runnable() {
@Override
public void run() {
callback.onResponse(response);
}
});
}
private Request buildPostRequest(String url,Map<String,Object> params){
return buildRequest(url,HttpMethodType.POST,params);
}
private Request buildGetRequest(String url,Map<String,Object> param){
return buildRequest(url,HttpMethodType.GET,param);
}
private Request buildRequest(String url,HttpMethodType methodType,Map<String,Object> params){
Request.Builder builder = new Request.Builder()
.url(url);
if (methodType == HttpMethodType.POST){
RequestBody body = builderFormData(params);
builder.post(body);
}
else if(methodType == HttpMethodType.GET){
url = buildUrlParams(url,params);
builder.url(url);
builder.get();
}
return builder.build();
}
private String buildUrlParams(String url ,Map<String,Object> params) {
if(params == null)
params = new HashMap<>(1);
String token = CniaoApplication.getInstance().getToken();
if(!TextUtils.isEmpty(token))
params.put("token",token);
StringBuffer sb = new StringBuffer();
for (Map.Entry<String, Object> entry : params.entrySet()) {
sb.append(entry.getKey() + "=" + (entry.getValue()==null?"":entry.getValue().toString()));
sb.append("&");
}
String s = sb.toString();
if (s.endsWith("&")) {
s = s.substring(0, s.length() - 1);
}
if(url.indexOf("?")>0){
url = url +"&"+s;
}else{
url = url +"?"+s;
}
return url;
}
private RequestBody builderFormData(Map<String,Object> params){
FormEncodingBuilder builder = new FormEncodingBuilder();
if(params !=null){
for (Map.Entry<String,Object> entry :params.entrySet() ){
builder.add(entry.getKey(),entry.getValue()==null?"":entry.getValue().toString());
}
String token = CniaoApplication.getInstance().getToken();
if(!TextUtils.isEmpty(token))
builder.add("token", token);
}
return builder.build();
}
enum HttpMethodType{
GET,
POST,
}
}
②构建BaseCallback类,主要是传入json数据将要转化的类型
public abstract class BaseCallback<T> {
public Type mType;
static Type getSuperclassTypeParameter(Class<?> subclass)
{
Type superclass = subclass.getGenericSuperclass();
if (superclass instanceof Class)
{
throw new RuntimeException("Missing type parameter.");
}
ParameterizedType parameterized = (ParameterizedType) superclass;
return $Gson$Types.canonicalize(parameterized.getActualTypeArguments()[0]);
}
public BaseCallback()
{
mType = getSuperclassTypeParameter(getClass());
}
public abstract void onBeforeRequest(Request request);
public abstract void onFailure(Request request, Exception e) ;
/**
*请求成功时调用此方法
* @param response
*/
public abstract void onResponse(Response response);
/**
*
* 状态码大于200,小于300 时调用此方法
* @param response
* @param t
* @throws IOException
*/
public abstract void onSuccess(Response response,T t) ;
/**
* 状态码400,404,403,500等时调用此方法
* @param response
* @param code
* @param e
*/
public abstract void onError(Response response, int code,Exception e) ;
}
③实现SimpleCallback类,传入Context参数,并实现一些具有共同逻辑的方法
public abstract class SimpleCallback<T> extends BaseCallback<T> {
protected Context mContext;
public SimpleCallback(Context context){
mContext = context;
}
@Override
public void onBeforeRequest(Request request) {
}
@Override
public void onFailure(Request request, Exception e) {
}
@Override
public void onResponse(Response response) {
}
@Override
public void onTokenError(Response response, int code) {
ToastUtils.show(mContext, mContext.getString(R.string.token_error));
Intent intent = new Intent();
intent.setClass(mContext, LoginActivity.class);
mContext.startActivity(intent);
CniaoApplication.getInstance().clearUser();
}
}
④为OKHttp实现具有对话框功能的封装类
-> spots-dialog开源控件
GitHub地址:https://github.com/d-max/spots-dialog
-> 加入依赖
dependencies {
compile 'com.github.d-max:spots-dialog:0.4@aar'
}
-> 使用
AlertDialog dialog = new SpotsDialog(context);
dialog.show();
...
dialog.dismiss();
-> 实现,在网络开始请求前加载对话框,在请求结束后结束对话框
public abstract class SpotsCallBack<T> extends SimpleCallback<T> {
private SpotsDialog mDialog;
public SpotsCallBack(Context context){
super(context);
initSpotsDialog();
}
private void initSpotsDialog(){
mDialog = new SpotsDialog(mContext,"拼命加载中...");
}
public void showDialog(){
mDialog.show();
}
public void dismissDialog(){
mDialog.dismiss();
}
public void setLoadMessage(int resId){
mDialog.setMessage(mContext.getString(resId));
}
@Override
public void onBeforeRequest(Request request) {
showDialog();
}
@Override
public void onResponse(Response response) {
dismissDialog();
}
}
⑤使用OKHttp的封装类来实现广告轮播组件
private ArrayList<Banner> banners = new ArrayList<>();
private OkHttpHelper mHelper = OkHttpHelper.getInstance();
private void requestImages2(){
String url ="http://112.124.22.238:8081/course_api/banner/query?type=1";
mHelper.get(url, new SpotsCallBack<ArrayList<Banner>>(getContext()) {
@Override
public void onSuccess(Response response, ArrayList<Banner> banners) {
if(banners != null){
for (Banner ban: banners){
TextSliderView textSliderView
= new TextSliderView(HomeFragment.this.getActivity());
textSliderView
.description(ban.getName())
.image(ban.getImgUrl());
textSliderView.setOnSliderClickListener(new BaseSliderView.OnSliderClickListener() {
@Override
public void onSliderClick(BaseSliderView slider) {
Toast.makeText(HomeFragment.this.getActivity(),
"slider 1 clicked", Toast.LENGTH_LONG).show();
}
});
sliderShow.addSlider(textSliderView);
}
}
}
@Override
public void onError(Response response, int code, Exception e) {
}
});
}
- okhttp封装okhttp-utils
- 封装OKHttp
- 封装OkHttp
- okhttp封装
- 封装OKHttp
- 封装OKHttp
- Okhttp封装
- OkHttp 封装
- OkHttp封装
- OKHttp封装
- Okhttp封装
- okHttp封装
- OkHttp封装
- Okhttp封装
- 封装okhttp
- okhttp封装
- 封装okhttp
- Okhttp封装
- JavaWeb之Servlet笔记
- web前端面试题及答案汇总
- java中方法的重写与重载(再次温故)
- GSON解析JSON
- github常见操作和常见错误!
- 封装OKHttp
- Arduino连接超声波传感器测距
- GIT 02 -git rebase -i 用法
- MBR和GPT概要学习
- iOS中宏(define)/常量(const)/变量的理解
- POJ3461 Oulipo
- FAST解析JSON
- 正则表达式
- 【GOF23设计模式】_中介者模式_同事协作类_内部类实现JAVA245