Retrofit2+Rxjava2网络请求框架的封装
来源:互联网 发布:锐捷mac 编辑:程序博客网 时间:2024/05/17 09:14
基于Retrofit和Rxjava2的联网框架,建造者模式构建RestClient,请求方法的封装,支持配置加载动画,链式调用。统一请求拿到后台返回的原始数据。
先来看网络请求示例代码
链式调用,简洁明了
* 请求网络 * * @param view */ public void request(View view) { RestClient restClient = RestClient.builder() .url("data/Android/10/1") .load(this)// .params(new WeakHashMap<String, Object>()) .success(new ISuccess() { @Override public void onSuccess(String response) { } }) .error(new IError() { @Override public void onError(int code, String msg) { } }) .build(); restClient.request(HttpMethod.GET); }这里写代码片
添加依赖这里用了依赖的统一管理
--------------------dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) compile rootProject.ext.dependencies.appcompatV7 implementation rootProject.ext.dependencies.constraintLayout compile rootProject.ext.dependencies.design compile rootProject.ext.dependencies.cardView compile rootProject.ext.dependencies.systembartint //Retrofit和Rxjava compile rootProject.ext.dependencies.rxjava2 compile rootProject.ext.dependencies.rxandroid2 compile rootProject.ext.dependencies.retrofit2 compile rootProject.ext.dependencies.converterGson compile rootProject.ext.dependencies.converterScalars compile rootProject.ext.dependencies.adapterRxjava2 //加载动画 compile rootProject.ext.dependencies.aviloader //okhttp3拦截器 compile rootProject.ext.dependencies.loggerinterceptor testImplementation rootProject.ext.dependencies.junit androidTestImplementation rootProject.ext.dependencies.runner androidTestImplementation rootProject.ext.dependencies.espresso}
HttpMethod 枚举类定义请求方法
* Created by kevin321vip on 2017/12/14. * 请求方法,枚举类 */public enum HttpMethod { GET, POST, POST_RAW, PUT, PUT_RAW, DELETE, UPLOAD这里写代码片
RestService 定义统一的ApiService接口
* Created by kevin321vip on 2017/12/14. * Api接口 */public interface RestService { @GET Observable<String> get(@Url String url, @QueryMap WeakHashMap<String, Object> params); @FormUrlEncoded @POST Observable<String> post(@Url String url, @QueryMap WeakHashMap<String, Object> params); @POST Observable<String> post(@Url String url, ResponseBody body); @FormUrlEncoded @PUT Observable<String> put(@Url String url, @FieldMap WeakHashMap<String, Object> params); @PUT Observable<String> putRaw(@Url String url, @Body RequestBody body); @DELETE Observable<String> delete(@Url String url, @QueryMap WeakHashMap<String, Object> params); @Streaming @GET Observable<ResponseBody> download(@Url String url, @QueryMap WeakHashMap<String, Object> params); @Multipart @POST Observable<String> upload(@Url String url, @Part MultipartBody.Part file);}这里写代码片
RestCreatorh(关键类)
**主要的Retroft的初始化配置,以及返回ApiService对象
1、主要是静态内部类Hodler的方式的单例对象获取**
2、.addConverterFactory(ScalarsConverterFactory.create())保证返回的是原始请求数据,方便根据状态等自行做过滤校验相关处理
3、ParamsHodler 单例管理Params多处使用不用重复new对象**
/** * 构建全局的Retrofit客户端 * .baseUrl(UrlConstance.BaseUrl) * .addConverterFactory(GsonConverterFactory.create()) * http://gank.io/api/data/Android/10/1 */ private static final class RetrofitHodler { private static final Retrofit RETROFIT_CLIENT = new Retrofit.Builder() .client(OkHttpHodler.OK_HTTP_CLIENT) .baseUrl("http://gank.io/api/") .addConverterFactory(ScalarsConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); } /** * OkhttpHodler */ private static final class OkHttpHodler { private static final OkHttpClient OK_HTTP_CLIENT = new OkHttpClient.Builder() .connectTimeout(UrlConstance.TimeOut, TimeUnit.SECONDS) .build(); } /** * RestService */ private static final class RestServiceHodler { private static final RestService REST_SERVICE = RetrofitHodler.RETROFIT_CLIENT.create(RestService.class); } /** * Params的Hodler */ private static final class ParamsHodler { private static final WeakHashMap<String, Object> PARAMS = new WeakHashMap<>(); } /** * 获取参数 * * @return */ public static WeakHashMap<String, Object> getParams() { return ParamsHodler.PARAMS; } /** * 获取Service */ public static RestService getService() { return RestServiceHodler.REST_SERVICE; }}这里写代码片
*
RestClient 关键类*
用来发起网络请求,通过Build模式传入请求参数和构建请求体
* 通过建造者模式传参 */ public static RestClientBuilder builder() { return new RestClientBuilder(); } /** * 发起网络请求 */ public void request(HttpMethod method) { //得到ApiService对象,通过相应的请求方法给observable实例化 发起请求 final RestService service = RestCreator.getService(); Observable<String> observable = null; if (REQUEST != null) { REQUEST.onRequestStart(); } if (LOADER_STYLE != null) { LyonLoader.showLoading(CONTEXT, LOADER_STYLE); } switch (method) { case GET: observable = service.get(URL, PARAMS); break; case POST: service.post(URL, PARAMS); observable = service.post(URL, PARAMS); break; case POST_RAW:// observable = service.postRaw(URL, BODY); break; case PUT: observable = service.post(URL, PARAMS); break; case PUT_RAW: service.putRaw(URL, BODY); break; case DELETE: observable = service.delete(URL, PARAMS); break; case UPLOAD: final RequestBody requestBody = RequestBody.create(MediaType.parse(MultipartBody.FORM.toString()), FILE); final MultipartBody.Part body = MultipartBody.Part.createFormData("file", FILE.getName(), requestBody); observable = service.upload(URL, body); break; default: break; } //发起网络请求,并在回调中将请求的数据回调出去 if (observable != null) { observable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<String>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(String s) { if (SUCCESS != null) { SUCCESS.onSuccess(s); } LyonLoader.stopLoading(); ToastUtils.show("请求成功" + s); } @Override public void onError(Throwable e) { LyonLoader.stopLoading(); if (ERROR != null) { ERROR.onError(0, e.getMessage()); } ToastUtils.show("请求失败" + e.getMessage()); } @Override public void onComplete() { } }); } } /** * get方法 */ public void get() { request(HttpMethod.GET); } /** * post方法 */ public void post() { request(HttpMethod.POST); }}**在Retrofit 的联网回调中将请求结果根据传入的回调接口相应的回调出去**
RestClientBuilder 构造器
RestClient的构造器,用于传入联网请求的配置信息,构造Reclient对象
* Created by kevin321vip on 2017/12/14.* RestClient的构建者*/public class RestClientBuilder {private final WeakHashMap<String, Object> PARAMS = RestCreator.getParams();private String URL = null;private IRequest REQUEST = null;private String DOWNLOAD_DIR = null;private String EXTENSION = null;private String NAME = null;private ISuccess SUCCESS = null;private IFailure FAILURE = null;private IError ERROR = null;private RequestBody BODY = null;private LoadStyle LOADER_STYLE = null;private File FILE = null;private Context CONTEXT = null;public final RestClientBuilder params(WeakHashMap<String, Object> params) {PARAMS.putAll(params);return this;}public final RestClientBuilder params(String key, Object value) {PARAMS.put(key, value);return this;}public final RestClientBuilder url(String url) {this.URL = url;return this;}public final RestClientBuilder request(IRequest iRequest) {this.REQUEST = iRequest;return this;}public final RestClientBuilder failure(IFailure iFailure) {this.FAILURE = iFailure;return this;}public final RestClientBuilder success(ISuccess iSuccess) {this.SUCCESS = iSuccess;return this;}public final RestClientBuilder error(IError iError) {this.ERROR = iError;return this;}public final RestClientBuilder dir(String downloaddir) {this.DOWNLOAD_DIR = downloaddir;return this;}public final RestClientBuilder extension(String extension) {this.EXTENSION = extension;return this;}public final RestClientBuilder name(String name) {this.NAME = name;return this;}public final RestClientBuilder body(RequestBody body) {this.BODY = body;return this;}public final RestClientBuilder LoadStyle(LoadStyle loadStyle) {this.LOADER_STYLE = loadStyle;return this;}public final RestClientBuilder file(File file) {this.FILE = file;return this;}public final RestClientBuilder load(Context context, LoadStyle loadStyle) {this.CONTEXT = context;this.LOADER_STYLE = loadStyle;return this;}public final RestClientBuilder load(Context context) {this.CONTEXT = context;this.LOADER_STYLE = LoadStyle.BallClipRotatePulseIndicator;return this;}public final RestClient build() {return new RestClient(URL, REQUEST, DOWNLOAD_DIR, EXTENSION, NAME, SUCCESS, FAILURE, ERROR, BODY, LOADER_STYLE, FILE, CONTEXT);}}这里写代码片
关于Loader就不介绍了,用了大神的:*com.wang.avi:library:2.1.3 做了一定的封装*
查看完整的代码请移步本人的github:
代码实现
。
阅读全文
0 0
- Retrofit2+Rxjava2网络请求框架的封装
- 简单实现RxJava2+Okhttp+Retrofit2的网络请求框架封装
- RxJava2+Retrofit2网络请求框架封装及使用
- rxjava2+rxandroid2+retrofit2 封装网络请求
- 基于RxJava2+Retrofit2的简单易用网络请求框架
- 简单上手的Retrofit2+Rxjava2网络请求框架
- Android RxJava2+Retrofit2搭建网络请求框架
- Rxjava2和Retrofit2网络库的封装
- RxJava2+Retrofit2实现网络请求和解析封装
- 最流行的网络请求框架Rxjava2+Retrofit完美封装
- Retrofit2+RxJava2进行网络请求
- 给你一个原汁原味的Retrofit2+Rxjava2的请求封装
- RxEasyHttp一款基于RxJava2+Retrofit2实现简单易用的网络请求框架
- Retrofit2+Rxjava2联网的封装
- RxJava2和Retrofit2实现简单网络请求
- Retrofit2+Rxjava2如何主动取消网络请求
- 3、RxJava2 & Retrofit2 封装实践 请求与响应的重度封装
- (一)最流行的网络请求框架Rxjava2+Retrofit完美封装
- 想下个个东西好难,要积分啊
- Property and xml configuration parse by using apache common lib commons-configuration.jar
- ==、equals()、hashCode()源码及原理分析
- tomcat+eclipse 远程debug
- utils/createrepo.sh
- Retrofit2+Rxjava2网络请求框架的封装
- springmvc 404 修改tomcat
- vim中选择匹配文本删除技巧
- apache+mod_wsgi+django
- 【笔记】位运算技巧
- cookie/session
- 福利活动之赠书
- 前端知识 | React-Router路由系统
- Android 实现属性动画平移,旋转,缩放,渐变 《H》