一、依赖配置
在Model:Android_xxxx.app build.gradle 文件夹里添加
dependencies {
//retrofit2
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
//Gson
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
//Jackson
//implementation 'com.squareup.retrofit2:converter-jackson:2.9.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.9.0'
//RxJava3的适配器
implementation 'com.squareup.retrofit2:adapter-rxjava3:2.9.0'
//OkHttp3
implementation 'com.squareup.okhttp3:okhttp:4.9.3'
//Rxjava3 + RxAndroid3
implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
implementation 'io.reactivex.rxjava3:rxjava:3.0.0'
}
二、Retrofit2的封装
请求结果的封装
public class HttpRespondBody<T>{
private int code;
private String message;
private Long count;
private T data;
public HttpRespondBody() {
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Long getCount() {
return count;
}
public void setCount(Long count) {
this.count = count;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
请求API代码示例
public interface HttpApi {
//Post请求
@POST("/user/login")
Observable<HttpRespondBody<你的数据实体类>> login(@Body 你的请求实体类 对象);
//Post请求 并携带文件
@Multipart
@POST("/app/upload/filedata")
Observable<MyRespondBody<UploadFileVO>> uploadFile(@Part("后端读取请求数据的字段") 你的请求实体类 对象, @Part MultipartBody.Part filePart);
}
Retrofit的封装
public class RetrofitUtil {
private static final int DEFAULT_TIMEOUT = 10;//超时时长
private static Retrofit retrofit;
private static RetrofitUtil retrofitUtil;
private RetrofitUtil() {
initRetrofit();
}
private OkHttpClient getOkHttpClient() {
return new OkHttpClient.Builder()
.readTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)//设置读取超时时间
.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)//设置请求超时时间
.writeTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)//设置写入超时时间
.retryOnConnectionFailure(false)//设置出现错误进行重新连接。
// .cache(cache) //设置缓存地址
.build();
}
private void initRetrofit() {
retrofit = new Retrofit.Builder()
.client(getOkHttpClient())
.baseUrl(Constant.BAST_URL)
.addCallAdapterFactory(RxJava3CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
}
public static HttpApi getHttpApi() {
if (retrofitUtil == null) {
synchronized (RetrofitUtil.class) {
if (retrofitUtil == null) {
retrofitUtil = new RetrofitUtil();
}
}
}
return retrofit.create(HttpApi.class);
}
}
三、RxJava3的封装
RxJava的封装
public class ObservableUtil {
private static CompositeDisposable compositeDisposable;
private static <T> DisposableObserver<HttpRespondBody<T>> build(HttpRespondListener<T> listener) {
DisposableObserver<HttpRespondBody<T>> observer = new DisposableObserver<HttpRespondBody<T>>() {
@Override
protected void onStart() {
super.onStart();
listener.onStart();
}
@Override
public void onNext(@NonNull HttpRespondBody<T> body) {
switch (body.getCode()) {
case Constant.REQEST_SUCCESS:
listener.onSuccess(body.getData(), body.getCount());
break;
default:
listener.onFailed(body.getMessage());
break;
}
}
@Override
public void onError(@NonNull Throwable e) {
listener.onFailed(e.toString());
}
@Override
public void onComplete() {
listener.onFinish();
}
};
return observer;
}
public static <T> Disposable addObservable(Observable<HttpRespondBody<T>> observable, HttpRespondListener<T> listener) {
Disposable disposable = observable.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(ObservableUtil.build(listener));
if (compositeDisposable == null){
synchronized (CompositeDisposable.class){
if (compositeDisposable == null){
compositeDisposable = new CompositeDisposable();
}
}
}
if (compositeDisposable.add(disposable)) {
return disposable;
}else {
listener.onFailed("请求异常!!!");
return null;
}
}
//访问监听回调
public interface HttpRespondListener<T> {
void onStart();
void onSuccess(T data, Long cunt);
void onFailed(String msg);
void onFinish();
}
}
CompositeDisposable是用于保存异步的请求,它提供了add和dispose方法。
四、封装的使用
//网络请求模块
public class HttpRequst {
public static Disposable login(LoginBean bean,@NonNull ObservableUtil.HttpRespondListener<String> listener){
//这里可以对请求数据进行处理和加密
return ObservableUtil.addObservable(RetrofitUtil.getHttpApi().login(bean), listener);
}
}
//Model模块
public class LoginModel {
public void login(LoginBean login){
HttpRequst.login(login, new ObservableUtil.HttpRespondListener<String>() {
@Override
public void onStart() {
//请求前的准备
}
@Override
public void onSuccess(String data, Long cunt) {
//请求成功
}
@Override
public void onFailed(String msg) {
//请求失败
}
@Override
public void onFinish() {
//请求结束
}
});
}
}
如果对您有一些意义,希望您给博主一些鼓励(点赞、关注、收藏),如果有错误欢迎大家评论。