Retrofit是一个现在网络请求框架,先来说一下怎么使用
- 网络权限(添加到AndroidManifest.xml)
- gradle依赖(添加到build.gradle)
implementation("com.squareup.okhttp3:okhttp:4.9.2") implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'com.squareup.retrofit2:converter-scalars:2.9.0'
- 定义接口,网络请求的方法
public interface Request { @GET("/xx/xx") Callget(); }
- 实例化Retrofit
Retrofit retrofit = new Retrofit.Builder().baseUrl("base_URL").build();
- 通过Retrofit实例创建接口服务对象
Request request = retrofit.create(Request.class);
- 调用接口中的方法
Callcall = request.get();
- 执行异步请求(同步请求需要创建一个新的线程去执行)
call.enqueue(new retrofit2.Callback2. Retrofit封装() { @Override public void onResponse(retrofit2.Call call, retrofit2.Response response) { } @Override public void onFailure(retrofit2.Call call, Throwable t) { } });
以上可以看出Retrofit是个好东西,可是用起来是比较麻烦的,所有在实际使用中对Retrofit进行一下小小的封装是很有必要的。
- 定义接口(所有的请求参数都是以map的形式)
public interface Request { @GET() Callget(@Url String url); @GET() Call get(@Url String url, @QueryMap Map map); @POST() Call post(@Url String url); @POST() @FormUrlEncoded Call post(@Url String url, @FieldMap Map map); }
- 定义RetrofitManager,以单例模式获取Retrofit实例
public enum RetrofitManager { INSTANCE; private static final String base_URL = " Your base_URL"; private Retrofit retrofit; public Retrofit getRetrofit(){ if(retrofit == null){ retrofit = new Retrofit.Builder() .baseUrl(base_URL) .build(); } return retrofit; } }
- 自定义的RetrofitCallback,在发送请求时,通过匿名对象作为参数获取后端的响应结果。
public abstract class RetrofitCallback { public void onStart(){ //开启loading } public void onCompleted(){ //关闭loading } public abstract void onSuccess(String resultJsonString); public abstract void onError(Throwable t); public void serverErrMsg(){ //xxx } public void reqErrMsg(){ //xxx } public void okMsg(){ //xxx } }
- 定义RetrofitUtil,封装get和post方法。将RetrofitCallback作为请求参数,在发送请求时重写onSuccess和onError方法,执行具体的 *** 作。
public class RetrofitUtil { private Retrofit(){} public static void get(String url, RetrofitCallback callback){ sendRequest(getRequest().get(url),callback); } public static void get(String url, Map3. RetrofitUtil使用map, RetrofitCallback callback){ sendRequest(getRequest().get(url,map),callback); } public static void post(String url, RetrofitCallback callback){ sendRequest(getRequest().post(url), callback); } public static void post(String url, Map map, RetrofitCallback callback){ sendRequest(getRequest().post(url,map), callback); } private static Request getRequest(){ Retrofit retrofit = RetrofitManager.INSTANCE.getRetrofit(); return retrofit.create(Request.class); } private void sendRequest(Call call,RetrofitCallback callback){ //开启loading callback.onStart(); //异步请求 call.enqueue(new Callback () { @Override public void onResponse(Call call, Response response) { //关闭loading callback.onCompleted(); if(response.isSuccessful()){ //执行RetrofitCallback的onSuccess方法,获取响应结果的json字符串 try { String result = response.body().string(); callback.onSuccess(result); //响应成功 if(StringUtils.equals(result, Constant.SUCCESS)){ callback.okMsg(); } } catch (IOException e) { e.printStackTrace(); } }else{ //服务异常 callback.serverErrMsg(); } } @Override public void onFailure(Call call, Throwable t) { callback.onCompleted(); //请求失败 callback.onError(t); callback.reqErrMsg(); } } }); } }
get无参请求
RetrofitUtil.get("/xx/xx", new RetrofitCallback() { @Override public void onSuccess(String resultJsonString) { } @Override public void onError(Throwable t) { } });
get有参请求
Mapmap = new HashMap<>(16); map.put("key","value"); //xxx RetrofitUtil.get("/xx/xx", map,new RetrofitCallback() { @Override public void onSuccess(String resultJsonString) { xxxx } @Override public void onError(Throwable t) { xxxx } });
post请求和get的使用方法相似
3. 最后本次只对get和post进行了封装,项目中只用到了这些就没有对文件上传下载以及别的请求方式进行封装。且没有添加转换器,可在RetrofitManager的getRetrofit()方法中自行添加。大概的封装思路就是这样的,可以自行发挥。
此文也只是在记录项目中对Retrofit的使用,对Retrofit的原理并没有较深的了解。
不足之处、欢迎留言。
感谢:对以下大佬的文章进行过参考,特此感谢Android网络框架Retrofit2使用封装:Get/Post/文件上传/下载
Retrofit的封装
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)