本文主要让大家知道RxJava2+Retrofit 2获取网络数据简单方法,如果有不了解RxJava和Retrofit请先去学习了在来阅读。
// RxJava2.0 implementation 'io.reactivex.rxjava2:rxjava:2.0.1' implementation 'io.reactivex.rxjava2:rxandroid:2.0.1' // Retrofit implementation 'com.squareup.retrofit2:retrofit:2.3.0' implementation 'com.google.code.gson:gson:2.2.4' implementation 'com.squareup.retrofit2:converter-gson:2.3.0'// retrofit+gson implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' // Rxjava与Retrofit结合使用必须添加这个依赖 compile 'com.github.bumptech.glide:glide:4.6.1' annotationProcessor 'com.github.bumptech.glide:compiler:4.6.1' //banner implementation 'com.youth.banner:banner:1.4.10'
public class OneBean { private List<DataBean> data; public List<DataBean> getData() { return data; } public void setData(List<DataBean> data) { this.data = data; } public static class DataBean { private String desc; private int id; private String imagePath; private int isVisible; private int order; private String title; private int type; private String url; public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getImagePath() { return imagePath; } public void setImagePath(String imagePath) { this.imagePath = imagePath; } public int getIsVisible() { return isVisible; } public void setIsVisible(int isVisible) { this.isVisible = isVisible; } public int getOrder() { return order; } public void setOrder(int order) { this.order = order; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public int getType() { return type; } public void setType(int type) { this.type = type; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } } }
public interface Api { //1.创建观察者 @GET("banner/json") Observable<OneBean> getBannerRequest();
Retrofit retrofit = new Retrofit.Builder() .baseUrl(url) .addCallAdapterFactory(RxJava2CallAdapterFactory.create())//创建Retrofit和RxJava关联 .addConverterFactory(GsonConverterFactory.create())//创建Gson解析 .build();
Api api = retrofit.create(Api.class);
api.getBannerRequest().subscribeOn(Schedulers.io())//订阅事件触发IO .observeOn(AndroidSchedulers.mainThread())//在主线程处理返回事件 .subscribe(new Observer<OneBean>() {//订阅 @Override public void onSubscribe(Disposable d) { //取消订阅 Log.e(TAG,"----------onSubscribe"); } @Override public void onNext(OneBean value) { list.addAll(value.getData()); //向下执行 Log.e(TAG,"----------onNext"+value.toString()); } @Override public void onError(Throwable e) { //抛异常触发 Log.e(TAG,"----------onError"); } @Override public void onComplete() { //设置banner for (OneBean.DataBean imgUrl:list) { imgViewUrl.add(imgUrl.getImagePath()); titles.add(imgUrl.getTitle()); } //设置图片加载器 banner.setImageLoader(new GlideImageLoader()); //设置banner样式 banner.setBannerStyle(BannerConfig.NUM_INDICATOR_TITLE); //设置banner动画效果 banner.setBannerAnimation(Transformer.DepthPage); //设置标题集合(当banner样式有显示title时) banner.setBannerTitles(titles); //设置图片集合 banner.setImages(imgViewUrl); //设置自动轮播,默认为true banner.isAutoPlay(true); //设置轮播时间 banner.setDelayTime(1500); // //设置指示器位置(当banner模式中有指示器时) // banner.setIndicatorGravity(BannerConfig.CENTER); //banner设置方法全部调用完毕时最后调用 banner.start(); //完成时 Log.e(TAG,"----------onComplete"); } });
public class RequestManager { public Retrofit mRetrofit ; public RequestApi requestApi; // private Context mContext; public RequestManager() { mRetrofit = createRetrofit(); requestApi = networkApi(RequestApi.class); // this.mContext = mContext; } //1.创建匿名内部内单利 public static class RequestManagerHolder{ public static RequestManager instance = new RequestManager(); } public static RequestManager getInstance() { return RequestManagerHolder.instance; } //动态代理 public <T>T networkApi(Class<T> api){ return mRetrofit.create(api); } //2.创建Retrofit网络请求 private Retrofit createRetrofit() { return new Retrofit.Builder().baseUrl(Constant.BASE_URL) .addCallAdapterFactory(RxJava2CallAdapterFactory.create())//关联RxJava2 .addConverterFactory(GsonConverterFactory.create())//创建Gson解析 .client(HttpClient()) .build(); } /** * 每次请求都会走拦截器,即:可以动态修改header */ private OkHttpClient HttpClient() { OkHttpClient.Builder builder = new OkHttpClient.Builder(); if (Constant.LOG_TYPE) { // OkHttp日志拦截器 builder.addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)); } // builder.addInterceptor(chain -> { // Request original = chain.request(); // Request request = original.newBuilder() // // 设置请求头 // .header("XX-Token", SPUtils.getInstance().getString("token", "")) // .header("XX-Device-Type", "android") // .method(original.method(), original.body()) // .build(); // return chain.proceed(request); // }); return builder.build(); } }
增加依赖
implementation 'com.squareup.okhttp3:okhttp:3.9.0' implementation 'com.squareup.okhttp3:logging-interceptor:3.9.0'
发现Retrofit搭配RxJava之后,绝对是最好用的网络请求库,如有问题,欢迎留言指正