android开发中,网络请求是必不可少的开发模块,所以对于网络请求的框架和封装在开发中就显得尤为重要,今天我这里就大概的描述下okhttp+rxJava+retrofit三者相结合网络请求的封装
在app的build.gradle中加入如下依赖
implementation 'com.squareup.retrofit2:adapter-rxjava:2.2.0'
implementation 'com.squareup.retrofit2:converter-gson:2.0.0-beta3'
implementation 'com.squareup.okhttp3:logging-interceptor:3.4.1'
implementation 'com.squareup.okhttp3:okhttp:3.4.1'
implementation 'io.reactivex:rxjava:1.1.9'
implementation 'io.reactivex:rxandroid:1.2.1'
这里为了描述的比较清晰,我这边大致把封装分为以下几个类来做描述,所需的类有以下五个:
* 接口返回的实体基类
* @param
*/
public class BaseReponse {
private static int SUCCESS_CODE=200;//成功的code
private int code; //响应码
private String message; //提示信息
private T results; //返回的具体数据
public boolean isSuccess(){
return getCode()==SUCCESS_CODE;
}
public static int getSuccessCode() {
return SUCCESS_CODE;
}
public static void setSuccessCode(int successCode) {
SUCCESS_CODE = successCode;
}
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 T getResults() {
return results;
}
public void setResults(T results) {
this.results = results;
}
@Override
public String toString() {
return "BaseReponse{" +
"code=" + code +
", message='" + message + '\'' +
", results=" + results +
'}';
}
}
* 工具拦截器
*/
public class InterceptorUtil {
public static final String TAG="------";
public static HttpLoggingInterceptor LogInterceptor() { //日志拦截器,用于打印返回请求的结果
return new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
Log.w(TAG,"log:"+message);
}
}).setLevel(HttpLoggingInterceptor.Level.BODY);
}
public static Interceptor HeaderInterceptor(){ //头部添加请求头信息
return new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request=chain.request().newBuilder().
addHeader("Content-Type","application/json;charSet=UTF-8").build();
return chain.proceed(request);
}
};
}
}
* 请求方法类
*/
public interface ApiServise {
//https://api.apiopen.top/musicDetails?id=604392760 接口完整路径
/**
* get请求方式
* @Query
* 形成单个查询参数, 将接口url中追加类似于"page=1"的字符串,形成提交给服务器端的参数,
* 主要用于Get请求数据,用于拼接在拼接在url路径后面的查询参数,一个@Query相当于拼接一个参数
*/
String HOST = "https://api.apiopen.top"; //接口地址
@GET("/musicDetails")
Observable>> getMeiZi(@Query("id") String id);
/**
* post请求方式
*/
@FormUrlEncoded //post请求必须要申明该注解
@POST("musicDetails") //方法名
Observable>> getInfo(@Field("id") String data);//请求参数
}
具体的注解说明可以参考以下链接:(转自简述 宁_593066063的博客)
Retrofit2中常用的注解介绍
4. BaseObserver ,它主要是请求成功失败、网络异常时的回调,它实现的Observer类,其中成功失败主要在Onext方法里处理;
* 请求回调,主要实现Observer类
* @param
*/
public abstract class BaseObserver implements Observer> {
private Context mContext;
public BaseObserver(Context mContext) {
this.mContext = mContext;
}
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
if (e instanceof ConnectException ||
e instanceof TimeoutException ||
e instanceof NetworkErrorException ||
e instanceof UnknownHostException) {
try {
onFailure(e, false);
} catch (Exception e1) {
e1.printStackTrace();
}
} else {
try {
onFailure(e, true);
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
@Override
public void onNext(BaseReponse tBaseReponse) {
if (tBaseReponse.isSuccess()) {
onSuccess(tBaseReponse);
} else {
onCodeError(tBaseReponse);
}
}
//请求成功且返回码为200的回调方法,这里抽象方法申明
public abstract void onSuccess(BaseReponse tBaseReponse);
//请求成功但返回的code码不是200的回调方法,这里抽象方法申明
public abstract void onCodeError(BaseReponse tBaseReponse);
//请求失败回调方法,这里抽象方法申明
public abstract void onFailure(Throwable e, boolean netWork) throws Exception;
}
* 通过初始化okhttp和retrofit,获取ApiServise的实例
* 主要做retrofit绑定okhttp,然后通过retrofit的实例
* 获取ApiServise的实例
*/
public class BaseRequest {
//初始化Okhttp,绑定拦截器事件
OkHttpClient client=new OkHttpClient.Builder().
connectTimeout(20, TimeUnit.SECONDS). //设置请求超时时间
readTimeout(20,TimeUnit.SECONDS). //设置读取数据超时时间
writeTimeout(20,TimeUnit.SECONDS). //设置写入数据超时时间
addInterceptor(InterceptorUtil.LogInterceptor()). //绑定日志拦截器
addNetworkInterceptor(InterceptorUtil.HeaderInterceptor()) //绑定header拦截器
.build();
Retrofit retrofit=new Retrofit.Builder().
addConverterFactory(GsonConverterFactory.create()). //设置gson转换器,将返回的json数据转为实体
addCallAdapterFactory(RxJavaCallAdapterFactory.create()). //设置CallAdapter
baseUrl(ApiServise.HOST).
client(client) //设置客户端okhttp相关参数
.build();
public static BaseRequest instance;
public ApiServise apiServise=retrofit.create(ApiServise.class); //通过retrofit的实例,获取ApiServise接口的实例
private BaseRequest(){
}
public static BaseRequest getInstance(){
if(instance==null){
synchronized (BaseRequest.class){
if(instance==null){
instance=new BaseRequest();
}
}
}
return instance;
}
public ApiServise getApiServise(){
return apiServise;
}
}
* 调用网络请求方法
*/
public void getData() {
BaseRequest.getInstance().getApiServise().getMeiZi("604392760").subscribeOn(Schedulers.io()).
observeOn(AndroidSchedulers.mainThread()).subscribe(new BaseObserver>(this) {
@Override
public void onSuccess(BaseReponse> t) {
//成功回调方法,可以直接在此更新ui,AndroidSchedulers.mainThread()表示切换到主线程
}
@Override
public void onCodeError(BaseReponse baseReponse) {
//失败回调方法,可以直接在此更新ui,AndroidSchedulers.mainThread()表示切换到主线程
}
@Override
public void onFailure(Throwable e, boolean netWork) throws Exception {
}
});
}
MeiZiResponse这个类我是随便定义的一个实体类,也没有跟返回的数据字段做一个映射,这里只是单纯的描述okhttp+RxJava+Retrofit网络封装,所以这里我就没有贴出来了.大致按照这五个步骤来,基本上就把网络请求这块的封装做好了.如下是我觉得还不错的几篇讲解okhttp+RxJava+Retrofit的博客,有需要的请自行查阅。
1.Retrofit各个注解的含义及作用
2.RxJava2.0——从放弃到入门
3.打造终极MVP+Retrofit2+okhttp3+Rxjava2网络请求,开发实用,简约