多平台统一管理软件接口,如何实现多平台统一管理软件接口
328
2023-01-19
RxJava和Retrofit2的统一处理单个请求示例详解
前言
Rxjava和Retrofit2用了一段时间了,写个小例子,分享出来,有什么不对的地方还请大神在评论区指正。
什么是Retrofit2
官网是这么介绍的:
Retrofit adapts a Java interface to HTTP calls by using annotations on the declared methods to
define how requests are made。
我翻译的可能不准确,他的大概意思是说:Retrofit 是一个 java 接口类,以注解的方式用于 HTTP 网络请求。那下面我们一起来看看是怎么使用的?
发现问题
最近在帮兄弟公司做一个资讯类的项目,使用了RxJava和Retrofit2这对黄金组合,在编写代码的过程中发现有很多很多的网络请求都需要做.subscribeOn(Schedulers.io()).observeOn(androidSchedulers.mainThread()).onErrorReturn()的处理,为避免这样,需要沉思。
解决问题
import android.util.Log;
import com.wei.caiqiwang.data.entity.BaseResponse;
import rx.Observable;
import rx.Subscriber;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Func1;
import rx.schedulers.Schedulers;
public class RxNet {
/**
* 统一处理单个请求
*/
public static
return observable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.onErrorReturn(new Func1
@Override
public BaseResponse
Log.v("LinNetError",throwable.getMessage());
callBack.onFailure(ExceptionHandle.handleException(throwable));
return null;
}
})
.subscribe(new Subscriber
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(BaseResponse
if (baseResponse.getCode().equals("200")) {
callBack.onSuccess(baseResponse.getData());
} else {
callBack.onFailure(baseResponse.getMsg());
}
}
});
}
/**
* 统一处理单个请求没有 msg body
*/
public static Subscription requestWithoutBody(Observable
return observable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.onErrorReturn(new Func1
@Override
public BaseResponse call(Throwable throwable) {
callBack.onFailure(ExceptionHandle.handleException(throwable));
return null;
}
})
.subscribe(new Subscriber
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(BaseResponse baseResponse) {
if (baseResponse.getCode().equals("200")) {
callBack.onSuccess(baseResponse.getMsg());
} else {
callBack.onFailure(baseResponse.getMsg());
}
}
});
}
}
回调就是普通的回调
public interface RxNetCallBack
/**
* 数据请求成功
*
* @param data 请求到的数据
*/
void onSuccess(T data);
/**
* 数据请求失败
*/
void onFailure(String msg);
}
错误异常处理(可能不全):
import android.net.ParseException;
import com.google.gson.jsonParseException;
import org.apache.http.conn.ConnectTimeoutException;
import org.json.JSONException;
import java.net.ConnectException;
import retrofit2.HttpException;
public class ExceptionHandle {
private static final int UNAUTHORIZED = 401;
private static final int FORBIDDEN = 403;
private static final int NOT_FOUND = 404;
private static final int REQUEST_TIMEOUT = 408;
private static final int INTERNAL_SERVER_ERROR = 500;
private static final int BAD_GATEWAY = 502;
private static final int SERVICE_UNAVAILABLE = 503;
private static final int GATEWAY_TIMEOUT = 504;
public static String handleException(Throwable e) {
String errorMsg;
if (e instanceof HttpException) {
HttpException httpException = (HttpException) e;
switch (httpException.code()) {
case UNAUTHORIZED:
case FORBIDDEN:
case NOT_FOUND:
case REQUEST_TIMEOUT:
case GATEWAY_TIMEOUT:
case INTERNAL_SERVER_ERROR:
case BAD_GATEWAY:
case SERVICE_UNAVAILABLE:
default:
errorMsg = "网络错误";
break;
}
return errorMsg + ":" + httpException.code();
} else if (e instanceof JsonParseException || e instanceof JSONException || e instanceof ParseException) {
return "解析错误";
} else if (e instanceof ConnectException) {
return "连接失败";
} else if (e instanceof javax.net.ssl.SSLHandshakeException) {
return "证书验证失败";
} else if (e instanceof ConnectTimeoutException) {
return "连接超时";
} else if (e instanceof java.net.SocketTimeoutException) {
return "连接超时";
} else {
return "未知错误";
}
}
}
然后就是ApiManager:
import android.util.Log;
import com.wei.demo.data.AppConstants;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
public class ApiManager {
private Retrofit client;
private ApiManager() {
client = new Retrofit.Builder()
.baseUrl(AppConstants.Base_Url_Api_Test)
.client(initClient())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
}
private static volatile DemoApi INSTANCE;
public static DemoApi getInstance() {
if (INSTANCE == null) {
synchronized (ApiManager.class) {
if (INSTANCE == null) {
INSTANCE = new ApiManager().getApi();
}
}
}
return INSTANCE;
}
private DemoApi getApi() {
return client.create(DemoApi.class);
}
private static OkHttpClient initClient() {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
//声明日志类
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
Log.v("NetLog", message);
}
});
//设定日志级别
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
//延时
builder.addInterceptor(httpLoggingInterceptor)
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS);
return builder.build();
}
}
怎么用?
RxNet.request(ApiManager.getInstance().getUserMsg(map), new RxNetCallBack>() {
@Override
public void onSuccess(List
// 处理数据
}
@Override
public void onFailure(String msg) {
//出现了错误
showToast(msg);
}
});
Demo https://github.com/FriendLin/NetRequestDemo (本地下载)
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~