android Retrofit2网络请求封装介绍
作者:扒鸡撕坦 时间:2022-02-09 18:46:49
1. Retrofit使用
Retrofit是一个现在网络请求框架,先来说一下怎么使用
网络权限(添加到AndroidManifest.xml)
<uses-permission android:name="android.permission.INTERNET" />
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")
Call<ResponseBody> get();
}
实例化Retrofit
Retrofit retrofit = new Retrofit.Builder().baseUrl("BASE_URL").build();
通过Retrofit实例创建接口服务对象
Request request = retrofit.create(Request.class);
调用接口中的方法
Call<ResponseBody> call = request.get();
执行异步请求(同步请求需要创建一个新的线程去执行)
call.enqueue(new retrofit2.Callback<ResponseBody>() {
@Override
public void onResponse(retrofit2.Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {
}
@Override
public void onFailure(retrofit2.Call<ResponseBody> call, Throwable t) {
}
});
2. Retrofit封装
以上可以看出Retrofit是个好东西,可是用起来是比较麻烦的,所有在实际使用中对Retrofit进行一下小小的封装是很有必要的。
定义接口(所有的请求参数都是以map的形式)
public interface Request {
/**
* 不带参数的get请求
* @param url
* @return
*/
@GET()
Call<ResponseBody> get(@Url String url);
/**
* 带参数的get请求
* @param url
* @param map 参数默认是map
* @return
*/
@GET()
Call<ResponseBody> get(@Url String url, @QueryMap Map<String,String> map);
/**
* 不带参数的post请求
* @param url
* @return
*/
@POST()
Call<ResponseBody> post(@Url String url);
/**
* 带参数的post请求
* @param url
* @param map
* @return
*/
@POST()
@FormUrlEncoded
Call<ResponseBody> post(@Url String url, @FieldMap Map<String,String> map);
}
定义RetrofitManager,以单例模式获取Retrofit实例
public enum RetrofitManager {
/**
* RetrofitManager的实例
*/
INSTANCE;
/**
*
* 后端接口的baseUrl,且只考虑一个url的情况(ip+端口,或者域名)
*/
private static final String BASE_URL = " Your BASE_URL";
private Retrofit retrofit;
/**
* 返回Retrofit实例,不添加转换器
* @return
*/
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
}
/**
* 执行成功
* @param resultJsonString 返回的json字符串
*/
public abstract void onSuccess(String resultJsonString);
/**
* 失败
* @param t 异常
*/
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(){}
/**
* 无参的get请求
* @param url
* @param callback
*/
public static void get(String url, RetrofitCallback callback){
sendRequest(getRequest().get(url),callback);
}
/**
* 有参的get请求
* @param url 请求的url
* @param map 参数
* @param callback 请求结束的回调
*/
public static void get(String url, Map<String,String> map, RetrofitCallback callback){
sendRequest(getRequest().get(url,map),callback);
}
/**
* 无参的post请求
* @param url
* @param callback
*/
public static void post(String url, RetrofitCallback callback){
sendRequest(getRequest().post(url), callback);
}
/**
* 有参的post请求
* @param url
* @param map
* @param callback
*/
public static void post(String url, Map<String,String> map, RetrofitCallback callback){
sendRequest(getRequest().post(url,map), callback);
}
/**
* 获取Request实例
* @return
*/
private static Request getRequest(){
Retrofit retrofit = RetrofitManager.INSTANCE.getRetrofit();
return retrofit.create(Request.class);
}
/**
* 发送请求的共通方法,并对响应结果进行处理
* @param call
* @param callback 自定义的Callback
*/
private void sendRequest(Call<ResponseBody> call,RetrofitCallback callback){
//开启loading
callback.onStart();
//异步请求
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> 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<ResponseBody> call, Throwable t) {
callback.onCompleted();
//请求失败
callback.onError(t);
callback.reqErrMsg();
}
}
});
}
}
3. RetrofitUtil使用
get无参请求
RetrofitUtil.get("/xx/xx", new RetrofitCallback() {
@Override
public void onSuccess(String resultJsonString) {
}
@Override
public void onError(Throwable t) {
}
});
get有参请求
Map<String,String> map = 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的使用方法相似
最后
本次只对get和post进行了封装,项目中只用到了这些就没有对文件上传下载以及别的请求方式进行封装。且没有添加转换器,可在RetrofitManager的getRetrofit()方法中自行添加。大概的封装思路就是这样的,可以自行发挥。
此文也只是在记录项目中对Retrofit的使用,对Retrofit的原理并没有较深的了解。
来源:https://blog.csdn.net/java13245/article/details/122194971
标签:Android,Retrofit2,封装
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
java实现MD5加密算法的实例代码
2021-10-01 16:49:14
浅谈一下Java中的悲观锁和乐观锁
2023-08-12 05:54:27
java程序代码与文本对比实用工具简介
2023-07-18 22:57:05
![](https://img.aspxhome.com/file/2023/9/77489_0s.png)
Java微信授权登陆的实现示例
2021-12-11 22:03:04
![](https://img.aspxhome.com/file/2023/1/62691_0s.png)
Java内存溢出案例模拟和原理分析过程
2023-04-09 07:27:48
![](https://img.aspxhome.com/file/2023/3/125573_0s.png)
java组件commons-fileupload实现文件上传、下载、在线打开
2022-02-24 22:16:59
![](https://img.aspxhome.com/file/2023/9/97789_0s.gif)
Java 网络编程socket编程等详解
2023-09-09 16:43:12
C#多线程系列之线程的创建和生命周期
2023-08-31 17:10:16
![](https://img.aspxhome.com/file/2023/2/77262_0s.jpg)
Spring boot整合log4j2过程解析
2023-11-29 10:47:53
![](https://img.aspxhome.com/file/2023/7/60107_0s.png)
mybatis中insert主键ID获取和多参数传递的示例代码
2023-09-20 07:11:00
java获取中文拼音首字母工具类定义与用法实例
2023-07-14 08:23:55
基于@RequestBody和@ResponseBody及Stringify()的作用说明
2021-12-14 01:47:38
![](https://img.aspxhome.com/file/2023/6/69106_0s.png)
解析Android开发优化之:对Bitmap的内存优化详解
2023-08-31 21:05:40
C#实现将浮点数表示的货币数量以汉字大写形式输出的方法
2022-06-10 03:10:36
![](https://img.aspxhome.com/file/2023/3/108643_0s.png)
Java异常分类及统一处理详解
2022-01-27 12:32:24
C#用Topshelf创建Windows服务的步骤分享
2022-10-19 00:47:58
![](https://img.aspxhome.com/file/2023/4/76414_0s.png)
C#如何动态创建lambda表达式
2022-04-18 21:57:16
Springboot中加入druid连接池
2023-08-08 05:47:22
C# 数独求解算法的实现
2022-04-04 18:48:57
![](https://img.aspxhome.com/file/2023/2/68102_0s.png)
Android中的应用认领总结
2022-03-12 02:54:05