您的位置:首页 > 理论基础 > 计算机网络

学习笔记 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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  网络 json gson string url