学习笔记 Tianmao 篇 OkHttp 网络的使用的简单封装 获取Json用GSON来解析
2016-10-28 15:10
711 查看
添加dependence依赖:
compile 'com.squareup.okhttp:okhttp:2.5.0' compile 'io.github.openfeign:feign-gson:9.3.1' //这个是使用网络图要用到的包Picasso.with(context).load(items[i].getImgUrl()).into(imageView); compile 'com.squareup.picasso:picasso:2.5.2'
一.用饥汉的单例模式模式
二.方法分为get()和post()
1.get(String url, BaseCallBack callBack)构建get的Request
1.post(String url,Map
2.使用Callback()进行失败和成功的操作具体处理使用我们自定义的BaseCallBack的方法
1.失败处理
失败操作调用baseCallBack.onFailure(request,e); okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Request request, IOException e) { callBack.onFailure(request,e); }
2.成功处理对于success和error我们会在调用okhttp类里用匿名类的方式完成onSuccess和onError方法 这里只是回调这个方法
1.使用BaseCallBack响应过了的方法 说明响应了
2.如果response.isSuccessful() 说明真正响应了
这里获取数据使用GSON解析 然后要用到 handler回到主线程 进行UI操作 mHandler.post(new Runnable() { @Override public void run() { baseCallBack.onSuccess(response,obj); } });
3.说明响应过了但是没有正真响应成功
这里要用到 handler回到主线程 进行UI操作 mHandler.post(new Runnable() { @Override public void run() { baseCallBack.onError(response,response.code(),e); }
OkHttpHelper类
package pers.lijunxue.tianmao.http; /** * Created by rabook on 2016/10/25. */ import android.os.Handler; import android.os.Looper; import android.util.Log; import com.google.gson.Gson; import com.google.gson.JsonParseException; import com.squareup.okhttp.Callback; import com.squareup.okhttp.FormEncodingBuilder; import com.squareup.okhttp.OkHttpClient; import com.squareup.okhttp.Request; import com.squareup.okhttp.RequestBody; import com.squareup.okhttp.Response; import java.io.IOException; import java.util.Map; import java.util.concurrent.TimeUnit; public class OkHttpHelper { 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,BaseCallBack callBack){ Request request = buildGetRequest(url); request(request,callBack); } public void post(String url,Map<String,String> 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) { callBack.onFailure(request,e); } @Override public void onResponse(Response response) throws IOException { callBack.onResponse(response); if(response.isSuccessful()) { //获取响应string 从流到 string String resultStr = response.body().string(); Log.d(TAG, "result=" + resultStr); //若是string类型直接返回 string if (callBack.mType == String.class){ callbackSuccess(callBack,response,resultStr); } else { try { //通过GSON来解析json Object obj = mGson.fromJson(resultStr, callBack.mType); //返回 解析后的 类型 callbackSuccess(callBack,response,obj); } catch (JsonParseException e){ // Json解析的错误 //返回错误代码 异常 callBack.onError(response,response.code(),e); } } } else { //响应不成功 callbackError(callBack,response,null); } } }); } 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 Request buildPostRequest(String url,Map<String,String> params){ return buildRequest(url,HttpMethodType.POST,params); } private Request buildGetRequest(String url){ return buildRequest(url,HttpMethodType.GET,null); } private Request buildRequest(String url,HttpMethodType methodType,Map<String,String> 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){ builder.get(); } return builder.build(); } private RequestBody builderFormData(Map<String,String> params){ FormEncodingBuilder builder = new FormEncodingBuilder(); if(params !=null){ for (Map.Entry<String,String> entry :params.entrySet() ){ builder.add(entry.getKey(),entry.getValue()); } } return builder.build(); } enum HttpMethodType{ GET, POST, } }
BaseCallBack类 Type mType属性是用来帮助GSON判断解析成什么类型的对象
package pers.lijunxue.tianmao.http; /** * Created by rabook on 2016/10/25. */ import com.google.gson.internal.$Gson$Types; import com.squareup.okhttp.Request; import com.squareup.okhttp.Response; import java.io.IOException; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; 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) ; }
SpotsCallBack类继承BaseCallBack类用于使用SpotsDialog
package pers.lijunxue.tianmao.http; /** * Created by rabook on 2016/10/25. */ import android.content.Context; import com.squareup.okhttp.Request; import com.squareup.okhttp.Response; import dmax.dialog.SpotsDialog; public abstract class SpotsCallBack<T> extends BaseCallBack<T> { private Context mContext; private SpotsDialog mDialog; public SpotsCallBack(Context context){ mContext = 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 onFailure(Request request, Exception e) { dismissDialog(); } @Override public void onBeforeRequest(Request request) { showDialog(); } @Override public void onResponse(Response response) { dismissDialog(); } }
相关文章推荐
- 学习笔记 Tianmao 篇 使用简单封装后的自定义OkHttp 获取json被GSON解析后的数据
- Andorid中使用Gson和Fast-json解析库解析JSON数据---第三方库学习笔记(二)
- iOS学习笔记-147.网络07——NSURLConnection04_简单JSON的解析
- Android建立网络连接,利用JSON数据获取百度图片搜索结果及GSON的简单使用
- android 学习笔记 解析json格式的数据 JSONObject 和GSON解析json格式数据
- iOS 一个简单的获取网络json 解析成模型数组
- Netty学习笔记之一(Netty解析简单的Http Post Json 请求)
- gson解析通过okhttp获取的json格式数据
- okhttp框架的最简单的基本使用 post和get请求以及用gson解析请求的数据
- JSON解析学习笔记(json、gson、fastjson)
- Android JSON数据格式的解析,与简单对象、带泛型的List和Map的转换,以及GSON的使用
- gson解析通过okhttp获取的json格式数据(转载)
- GSON解析json的学习笔记
- Cocos2dx学习笔记37 Json 数据解析rapidjson库的使用
- IOS学习笔记,网络请求,json解析
- android菜鸟学习笔记25----与服务器端交互(二)解析服务端返回的json数据及使用一个开源组件请求服务端数据
- gson解析json字符串学习笔记...
- SpringMVC学习笔记001-服务器端获取JSON字符串并解析
- iOS学习笔记网络篇之数据解析(JSON/XML)
- TCP-IP学习笔记二:NIO的网络编程Buffer简单使用