9步实现Retrofit的二次封装

实现retrofit框架的步骤:

第一步:导入jar包
jar包资源地址  
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'

第二步:URL常量类
第三步:创建公共的请求bean,BaseResponse,  根据接口的返回规则进行调整。
类似下面的:
public class BaseResponse<T> {
//返回的具体的字段名称由与接口研发人员约定
private int error_code;
private String reason;
private T result;

public int getError_code() {
return error_code;
}

public void setError_code(int error_code) {
this.error_code = error_code;
}

public String getReason() {
return reason;
}

public void setReason(String reason) {
this.reason = reason;
}


public T getResult() {
return result;
}

public void setResult(T result) {
this.result = result;
}
}

第四步,解析json/xml帮助类
package com.qqy.security.securitycontrol.utils;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;

import java.util.ArrayList;
import java.util.List;

/**
* Created by serena on 2017/03/28.
* Description:
*/

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

/**
* 根据json和返回值类型,返回对应的返回值
* @param jsonString
* @param entityClass
* @param <T>
* @return
*/
public static <T>T convertEntity(String jsonString,Class<T> entityClass){
T entity = null;
try{
entity = gson.fromJson(jsonString.toString(),entityClass);
}catch (Exception e){
e.printStackTrace();
}

return entity;
}


/**
* 根据json和返回值的列表的子类型,解析到列表
* @param jsonString
* @param entityclass//列表中的子类型
* @param <T>
* @return
*/
public static <T> List<T> convertEntities(String jsonString , Class<T> entityclass){
List<T> entities = new ArrayList<>();
try{
JsonArray jsonArray = jsonParser.parse(jsonString.toString()).getAsJsonArray();
for(JsonElement element: jsonArray){
entities.add(gson.fromJson(element,entityclass));
}
}catch (Exception e){
e.printStackTrace();
}
return entities;
}

public static String objectToJSONString(Object object){
return gson.toJson(object);
}


}

第五步,在baseActivity中进行注册retrofit
/**
* Created by serena on 2017/03/28.
* Description:如果是在mvc设计模式下则在baseactivity中进行初始化,如果是mvp项目模式下,则在Model的实现类中进行初始化。
 */

public class BaseActivity extends AppCompatActivity {
public Retrofit retrofit;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())//进行json转换的
.baseUrl(ConstantsUrl.BASE_HTTPURL)
.build();

}
}

第六步,创建数据返回监听:
package com.qqy.security.securitycontrol.base;
/**
* Created by serena on 2017/03/28.
* Description:
*/
public interface OnResonseLisner<T> {
void onSucess(T info,int actionId);
void onClientEror(String errorMsg,int actionId);
void onServerEror(String errorMsg,int actionId);

}

第七步,创建自定义callback,RequestCallBack
package com.qqy.security.securitycontrol.base;

import com.qqy.security.securitycontrol.bean.BaseResponse;
import com.qqy.security.securitycontrol.utils.GsonHelper;

import java.io.IOException;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;


/**
* Created by serena on 2017/03/28.
* Description:
*/

public abstract class RequestCallBack implements Callback<BaseResponse> {
public final int RESPONSE_SUCESS=0;
public final int RESPONSE_FAIL = 1;


@Override
public void onResponse(Call<BaseResponse> call, Response<BaseResponse> response) {
BaseResponse baseResponse = response.body();
handleMsg(baseResponse);

}

@Override
public void onFailure(Call<BaseResponse> call, Throwable t) {
onError(t.getMessage());

}


private void handleMsg(BaseResponse baseResponse) {
if (baseResponse.getError_code()==(RESPONSE_SUCESS)){
onSucess(GsonHelper.objectToJSONString(baseResponse.getResult()));//要根据具体的接口结构进行相应的修改

}else{
onError(baseResponse.getReason());
}

}

protected abstract void onSucess(String jsonstr);
protected abstract void onError(String errormsg);


}

第八步,创建解析类ServiceHelper
package com.qqy.security.securitycontrol.base;

import com.qqy.security.securitycontrol.bean.BaseResponse;
import com.qqy.security.securitycontrol.utils.GsonHelper;

import java.util.List;

import retrofit2.Call;

/**
* Created by serena on 2017/03/28.
* Description:
*/

public class ServiceHelper {

/**
* 获取单个实体对象
*
* @param call
* @param entityclass 得到的预期结果的对象
* @param <T>
*/
public static <T> void callEntity(final Call<BaseResponse> call, final Class<T> entityclass, final OnResonseLisner<T> lisner, final int actionId) {
call.enqueue(new RequestCallBack() {
@Override
protected void onSucess(String jsonstr) {
T info = GsonHelper.convertEntity(jsonstr, entityclass);
if (info == null) {
if (lisner != null) {
lisner.onClientEror("对象解析失败",actionId);
}
} else {
if (lisner != null) {
lisner.onSucess(info,actionId);
}
}

}

@Override
protected void onError(String errormsg) {

if (errormsg != null) {
lisner.onServerEror(errormsg,actionId);
}

}
});
}


public static <T> void callEntities(Call<BaseResponse> call, final Class<T> entityclass , final OnResonseLisner<T> lisner, final int actionId){
call.enqueue(new RequestCallBack() {
@Override
protected void onSucess(String jsonstr) {
List<T> infolist = GsonHelper.convertEntities(jsonstr,entityclass);
if (infolist == null) {
if (lisner != null) {
lisner.onClientEror("对象解析失败",actionId);
}
} else {
if (lisner != null) {
lisner.onSucess(infolist,actionId);
}
}

}

@Override
protected void onError(String errormsg) {

}
});

}



}

第九步,创建对应于业务的请求接口
类似下面
package com.qqy.security.securitycontrol.requestinterface;

import com.qqy.security.securitycontrol.base.ConstantsUrl;
import com.qqy.security.securitycontrol.bean.BaseResponse;
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;

/**
* Created by serena on 2017/03/28.
* Description:用户信息相关的接口,表单形式,以及json形式的传递
*/

public interface MemberInface {

@GET("usedcar/city")
Call<BaseResponse> findCity(@Query("province") String province ,@Query("key") String appkey);

@POST("usedcar/city")
Call<BaseResponse> findCitypost(@Field("province") String province ,@Field("key") String appkey)

/**
//登录-json的形式传参   Headers中需要设置的常量说明:
 CONTENT_TYPE= "Content-Type: application/json"
 ACCEPT= "Accept: application/json"
**/
@Headers({ConstantsFinal.CONTENT_TYPE,ConstantsFinal.ACCEPT})@POST(ConstanceURL.GET_LOGIN)Call<BaseResponse> login(@Body RequestBody requestBody);

}
public class HTTPUtils {
    /**
     *将封装好的请求bean,转化为requestBody,用于传递json格式的参数
     * @param url  本次请求的地址,用于打印请求参数日志
     * @param object
     * @return
     */
    public static RequestBody getRequestBody(String url,Object object){
        Gson gson = new Gson();
        String jsonstr = gson.toJson(object);
        RequestBody body=RequestBody.create(okhttp3.MediaType.parse(ConstantsFinal.PARSETYPE),jsonstr);
        Log.i("====缘天然用户端:",url+"  *****    请求requestjson="+jsonstr);
        return body;
    }

}

最终使用:
LoginRequest login = new LoginRequest();
login.setUsername(username);
login.setPassword(pwd);

ServiceHelper.callEntity(
        retrofit.create(FPRequest.class).login(HTTPUtils.getRequestBody(ConstanceURL.BASE_URL+ConstanceURL.GET_LOGIN,login)),
        LoginResult.class,
      new OnResponseLisener<LoginResult>() {
     @Override
     public void onSucess(LoginResult object, int actionId) {
    }

    @Override
    public void onClientEror(String errorMsg, int actionId) {
    }

    @Override
    public void onServerEror(String errorMsg, int actionId) {
    }
}
, ConstanceRequestCode.LOGIN);


 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值