前言
RxJava现在比较火,从网上查了一些关于RxJava的学习资料,感觉确实不错, 但是发现网上关于RxJava的讲解大都是理论上的,知识点式的罗列,讲解。RxJava在Android开发方面的是实际应用并没有一个较细致明确的demo展示(可能自己看的文章少)。 很常见,通过服务器的接口,网络请求获得数据,并把数据展示在列表上。怎么样功能在咱们Android开发中很常见吧~
准备
用RxJava来实现Android开发中的功能,前提得要知道RxJava,了解RxJava的知识点才行。
这里笔者不就细说了,因为网上现在关于RxJava的入门介绍挺多的。这里给推荐两个大家可以去看看,写的很不错:
1.Season_zlc写的RxJava系列文章。
(http://www.jianshu.com/p/464fa025229e)
2.作者:抛物线
(http://gank.io/post/560e15be2dca930e00da1083)
效果
开撸
通过上面的效果,我们阐述下流程:
点击获取数据->发送网络请求,显示加载圆圈
—>网络请求成功显示数据,隐藏加载圆圈;
第一步:
UI搭建出来,数据显示的列表选用强大的RecycleView,
下面放个button按钮,loading圆圈用ProgressBar;
这部分比较简单就不贴代码了。
第二步:
各个控件的初始化搞定,主要是recycleview的设置。
第三步:
网络请求逻辑。重点来了,别睡啦。。
我们知道RxJava 有一个Observable 译为 “可观察的”,感觉可观察的说起来很拗口,
我们就喊他 “被观察者”吧,不过我习惯性喊他发送者~还有一个Observer “观察者”。
观察者与被观察者之间建立起联系是通过subscribe()这个函数。
被观察者和观察者的工作原理,通俗点说就是,在被观察者中做一些逻辑处理,
然后吧结果交给被观察者所订阅的观察者处理。。跑题了不说理论。。上代码:
private void getData() {Observable<ArrayList<Result.ResultsBean>> mObservable = Observable.create(new ObservableOnSubscribe<ArrayList<Result.ResultsBean>>() {@Overridepublic void subscribe(@NonNull ObservableEmitter<ArrayList<Result.ResultsBean>> e) throws Exception {OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url("http://gank.io/api/data/Android/10/1").build();Response response = client.newCall(request).execute();if (response.isSuccessful()) {result = Utils.transform(response.body().string(), Result.class);e.onNext((ArrayList<Result.ResultsBean>) result.getResults());}}});Observer<ArrayList<Result.ResultsBean>> mObserver = new Observer<ArrayList<Result.ResultsBean>>() {@Overridepublic void onSubscribe(@NonNull Disposable d) {}@Overridepublic void onNext(@NonNull ArrayList<Result.ResultsBean> s) {mBeans = s;mPb.setVisibility(View.GONE);mAdaptor.notifyDataSetChanged();}@Overridepublic void onError(@NonNull Throwable e) {}@Overridepublic void onComplete() {}};mObservable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(mObserver);}
主要就是getData这个方法。observable中的泛型就是我们想要的数据类型。
比如你想要String类型的结果,那你就填String。这里我是写了个实体类来封装我想要的结果。
网络请求使用的是OkHttp3,Json数据转换用了Gson.
特别说明的一点是:
mObservable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(mObserver);
这个语句。subscribe()方法表示将被观察者Observable和观察者Observer构成了订阅关系。
Schedulers是一个线程调度器,Schedulers.io()通常用来执行些文件输入输出类,耗时类操作,会开个子线程。
subscribeOn(Schedulers.io())语句表示被观察者的操作处于子线程中。
observeOn(AndroidSchedulers.mainThread())表示观察者的操作处于主线程中。
简单的这两行语句就可以很轻松的帮开发者自由切换主线程和子线程。而且代码看起来逻辑很清楚,很整洁,再加上RxJava很多作用强大的操作符。RxJava火起来是肯定的。
完整代码已上传到GitHub,觉得有用请给个star,跪谢。链接:
(https://github.com/MRYangY/RxAndroidDemo1.git)
宣传一个本人写的APP,仿今日头条的集合了QQ登录和ShareSDK,功能还比较完善,数据内容还不错。
掌中新闻APP 仿今日头条
(https://github.com/MRYangY/PalmRead.git)