实现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"@Headers({ConstantsFinal.CONTENT_TYPE,ConstantsFinal.ACCEPT})@POST(ConstanceURL.GET_LOGIN)Call<BaseResponse> login(@Body RequestBody requestBody);ACCEPT= "Accept: application/json"**/
}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);