添加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();
}
}