1 BasePresenter
/**
* Created by HASEE.
* 封装项目中所有网络请求基类
*/
public abstract class BasePresenter {
public ResponseInfoApi responseInfoApi;
private HashMap<String,String> errorMap = new HashMap<>();
public BasePresenter(){
errorMap.put("1","错误类型一");
errorMap.put("2","错误类型二");
errorMap.put("3","错误类型三");
errorMap.put("4","错误类型四");
errorMap.put("5","错误类型五");
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Constant.BASEURL)//请求链接地址
.addConverterFactory(GsonConverterFactory.create())//请求返回数据,以及需要用到解析的工具
.build();//构建retrofit对象
//如何发送请求方法
//1.完整链接地址
//2.请求方式
//3.请求参数
//4.请求结果数据用什么进行封装
responseInfoApi = retrofit.create(ResponseInfoApi.class);
//将请求发送出去
/*Call<ResponseInfo> call = responseInfoApi.getHomeInfo("home");
call.enqueue(callBack);*/
}
class CallBackAdapter implements Callback<ResponseInfo> {
@Override
public void onResponse(Call<ResponseInfo> call, Response<ResponseInfo> response) {
//如果请求完成后服务器有响应
ResponseInfo responseInfo = response.body();
if (responseInfo.code.equals("0")){
//data字段中的数据才是有意义的
String json = responseInfo.data;
//解析展示,无法在父类中具体实现,提供一个抽象方法,让子类实现
parseJson(json);
}else{
//本次请求响应有异常
String errorMessage = errorMap.get(responseInfo.code);
onFailure(call,new RuntimeException(errorMessage));
}
}
@Override
public void onFailure(Call<ResponseInfo> call, Throwable t) {
if (t instanceof RuntimeException){
//t.getMessage()方法获取的就是RuntimeException中提供的参数
sendErrorMessage(t.getMessage());
}
//请求失败方法,无服务没有给响应方法
sendErrorMessage("请求异常");
}
}
//留给子类处理错误方法
protected abstract void sendErrorMessage(String errorMessage);
//留给子类需要进行实现解析方法
protected abstract void parseJson(String json) ;
private void syncGetRequest() {
new Thread(){
@Override
public void run() {
try {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Constant.BASEURL)//请求链接地址
.addConverterFactory(GsonConverterFactory.create())//请求返回数据,以及需要用到解析的工具
.build();//构建retrofit对象
//如何发送请求方法
//1.完整链接地址
//2.请求方式
//3.请求参数
//4.请求结果数据用什么进行封装
ResponseInfoApi responseInfoApi = retrofit.create(ResponseInfoApi.class);
//将请求发送出去
Call<ResponseInfo> call = responseInfoApi.getHomeInfo("home");
//请求发出去后,得到一个响应体
Response<ResponseInfo> response = call.execute();//同步请求
//通过响应体获取数据
ResponseInfo responseInfo = response.body();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
/*public interface GitHub {
//@GET指定的是请求方式
//@GET括号中()包含就是链接地址(方法传递参数形式指定)
//@Path("owner") 指定的就是可变链接地址内容
//请求返回值结果,由Call中的泛型指定
@GET("/repos/{owner}/{repo}/contributors")
Call<List<Contributor>> contributors(@Path("owner") String owner, @Path("repo") String repo);
}*/
}
2 childPresenter
public class HomePresenter extends BasePresenter{
private HomeAdapter homeAdapter;
public HomePresenter(HomeAdapter homeAdapter) {
this.homeAdapter = homeAdapter;
}
@Override
protected void sendErrorMessage(String errorMessage) {
}
@Override
protected void parseJson(String json) {
Log.i("","json = "+json);
Gson gson = new Gson();
HomeInfo homeInfo = gson.fromJson(json, HomeInfo.class);
homeAdapter.setData(homeInfo);
}
//网络请求触发方法
public void getHomeData(){
Call<ResponseInfo> call = responseInfoApi.getHomeInfo("home");
call.enqueue(new CallBackAdapter());
}
}
3 请求接口ResponseInfoApi
public interface ResponseInfoApi {
//此方法是只指定了链接地址,没有带上参数网络请求方法
@GET("{home}")
Call<ResponseInfo> getHomeInfo(@Path("home") String url);
//此方法是不仅需要指定请求地址,还需要带上请求参数
//@Query 指定传递参数关键字 在括号内需要指定传递给服务器参数名称
@GET("{home}")
Call<ResponseInfo> getHomeInfo(
@Path("home") String url, @Query("latitude") String lat, @Query("longitude") String lng);
//其余模块请求方式,请求地址,请求参数各不相同,只需要在此处定义多个方法即可
@GET("business")
Call<ResponseInfo> getGoodsInfo(@Query("sellerId") long sellerId);
/*@FormUrlEncoded()
@POST("login")
Call<ResponseInfo> getLoginUserInfo(@Field("username") String username,
@Field("password") String password,
@Field("phone") String phone,
@Field("type") int type);*/
@GET("login")
Call<ResponseInfo> getLoginUserInfo(@Query("username") String username,
@Query("password") String password,
@Query("phone") String phone,
@Query("type") int type);
}