1. Retrofit使用 {#1.-retrofit%E4%BD%BF%E7%94%A8}
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封装 {#2.-retrofit%E5%B0%81%E8%A3%85}
以上可以看出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使用 {#3.-retrofitutil%E4%BD%BF%E7%94%A8}
- 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的使用方法相似
4. 最后 {#4.-%E6%9C%80%E5%90%8E}
本次只对get和post进行了封装,项目中只用到了这些就没有对文件上传下载以及别的请求方式进行封装。且没有添加转换器,可在RetrofitManager的getRetrofit()方法中自行添加。大概的封装思路就是这样的,可以自行发挥。
此文也只是在记录项目中对Retrofit的使用,对Retrofit的原理并没有较深的了解。
不足之处、欢迎留言。
感谢:对以下大佬的文章进行过参考,特此感谢 {#%E6%84%9F%E8%B0%A2%EF%BC%9A%E5%AF%B9%E4%BB%A5%E4%B8%8B%E5%A4%A7%E4%BD%AC%E7%9A%84%E6%96%87%E7%AB%A0%E8%BF%9B%E8%A1%8C%E8%BF%87%E5%8F%82%E8%80%83%EF%BC%8C%E7%89%B9%E6%AD%A4%E6%84%9F%E8%B0%A2}
https://blog.csdn.net/ahuyangdong/article/details/82760382
https://blog.csdn.net/yoonerloop/article/details/112095980