首先感谢这位大神的博客:https://blog.csdn.net/u014569233/article/details/67639522,在他的基础上根据自己项目进行了修改最后成为现在项目使用的样子,发出来分享下。

1、结合自己项目创建公共请求的类,服务器返回的数据格式见下面注释

public class BaseResponse<T> {

    /**
     * Success : true
     * Code : 1
     * ErrorMsg_zh : 请求成功
     * ErrorMsg_en : 请求成功
     * Data : {"UID":1183555,"Name":"student","Phone":"189xxxx8724","Email":null,"FacePic":null,"Token":"6374D689C857124AD3AB87D2FF95E85EDD711160C4BC29C6E0BD1B0B24F41312"}
     * ServerTime : 1533288384
     * LogId : 20180803172624518
     */
    public boolean Success;
    public int Code;
    public String ErrorMsg_zh;
    public String ErrorMsg_en;
    public T Data;
    public int ServerTime;
    public String LogId;

}

登陆时服务器返回的LoginBean类:

public class LoginBean {
    public boolean Success;
    public int Code;
    public String ErrorMsg_zh;
    public String ErrorMsg_en;
    public DataBean Data;
    public int ServerTime;
    public String LogId;

    public static class DataBean {
        public int UID;
        public String Name;
        public String Phone;
        public String Email;
        public String FacePic;
        public String Token;
}

 

2、登陆接口(Call后面泛型写第1步定义的BaseResponse)

public interface Login {
    @GET("api/Student/Login")
    Call<BaseResponse> getLoginData(@Query("phone") String phoneNum, @Query("md5Password") String passWord);
}

3、单例模式RetrofitManager管理类

public class RetrofitManager {public static Retrofit mRetrofit;
    private static RetrofitManager mRetrofitManager;

    private RetrofitManager() {
        initRetrofit();
    }

    private void initRetrofit() {
        OkHttpClient.Builder builder = new OkHttpClient
                .Builder();
        //声明日志拦截器
        HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
        //设定日志级别及超时时间为5s
        httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);
        builder.connectTimeout(5, TimeUnit.SECONDS);
        builder.readTimeout(5, TimeUnit.SECONDS);
        builder.writeTimeout(5, TimeUnit.SECONDS);

        //添加拦截器
        builder.addInterceptor(httpLoggingInterceptor);
        mRetrofit = new Retrofit.Builder()
                .baseUrl(Constant.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .client(builder.build())
                .build();

    }

    public static synchronized RetrofitManager getInstance() {
        if (mRetrofitManager == null) {
            mRetrofitManager = new RetrofitManager();
        }
        return mRetrofitManager;
    }

    public <T> T createReq(Class<T> reqServer) {
        return mRetrofit.create(reqServer);
    }

}

4、Gson数据解析工具类:用于解析服务器返回的数据,将其转换为对应的bean类

public class GsonHelper {
    static Gson gson = new Gson();
    static JsonParser jsonParser = new JsonParser();

    public static <T>T convertEntity(String jsonString,Class<T> entityClass){
        T entity = null;
        entity = gson.fromJson(jsonString.toString(),entityClass);
        return entity;
    }
    public static  String objectToJSONString(Object object){
        return  gson.toJson(object);
    }
}

5、实现请求访问及数据解析处理的关键类ServiceHelper

public class ServiceHelper {

    public static <T> void callEntity(Call<BaseResponse> call, final Class<T> entityClass, final OnResponseLisner<T> lisner){
        call.enqueue(new MyCallBack() {
            @Override
            protected void onSuccess(String jsonStr) {
                T info = GsonHelper.convertEntity(jsonStr,entityClass);
                if (info == null) {
                    if (lisner != null) {
                        lisner.onError("对象解析失败");
                    }
                } else {
                    if (lisner != null) {
                        lisner.onSuccess(info);
                    }
                }
            }

            @Override
            protected void onError(String errormsg) {
                if (errormsg != null) {
                    lisner.onError(errormsg);
                }
            }
        });
    }
}

6、请求返回数据之后的回调监听接口

public interface OnResponseLisner<T> {
    void onSuccess(T info);
    void onError(String errorMsg);
}

7、MyCallback处理(注意服务器返回数据格式和bean类不对应的坑:baseResponse.ErrorMsg_en == null

 


public abstract class MyCallBack implements Callback<BaseResponse> {

String TAG = "MyCallBack";

@Override
public void onResponse(Call<BaseResponse> call, Response<BaseResponse> response) {
BaseResponse baseResponse = response.body();
if (baseResponse == null) { //服务器内部错误返回数据为空处理
onError(Constant.SERVER_DATA_FORMAT_ERROR);
return;
}
Log.d(TAG, "baseResponse :" + baseResponse.toString());
handleMsg(baseResponse);
}

@Override
public void onFailure(Call<BaseResponse> call, Throwable t) {
Log.d(TAG, "onFailure :" + t.getMessage());
onError(Constant.SERVER_FAILED);
}

private void handleMsg(BaseResponse baseResponse) {
LogUtil.d(TAG, "baseResponse:" + baseResponse.Success);
if (baseResponse.Success) {
onSuccess(GsonHelper.objectToJSONString(baseResponse));
} else {
if (baseResponse.ErrorMsg_en == null) { //服务器返回数据格式错误处理
onError(Constant.SERVER_DATA_FORMAT_ERROR);
} else {
onError(baseResponse.ErrorMsg_zh);
}
}
}

protected abstract void onSuccess(String jsonStr);

protected abstract void onError(String errormsg);
}
 

 

 

 

8、最终调用(以登录过程为例)  

 ServiceHelper.callEntity(RetrofitManager.getInstance().createReq(Login.class).getLoginData(phoneNum, mMd5Pwd), LoginBean.class, new OnResponseLisner<LoginBean>() {
            @Override
            public void onSuccess(LoginBean info) {
                int mUid = info.getData().getUID();
             
                String token = info.getData().getToken();
                saveToken(token);

                mILoginView.loginResult(true, String.valueOf(mUid));
            }

            @Override
            public void onError(String errorMsg) {
                mILoginView.loginResult(false, errorMsg);
            }
        });

 

PS:主要是参考上面那位大神的,自己修改的部分比较少,希望能对你们改造自己的项目有点帮助,遗憾的是上面还没有加入RXjava,之后项目加入之后再更新。

posted on 2018-08-21 18:18  slma  阅读(400)  评论(0编辑  收藏  举报