首先 在这里放上两个库的地址
https://github.com/ReactiveX/RxJava
https://github.com/ReactiveX/RxAndroid
在android studio 中 我们可以添加依赖
compile 'io.reactivex:rxjava:1.0.14'
compile 'io.reactivex:rxandroid:1.0.1'
在我看来 Rxjava 是异步,简洁的代名词,
可能自己理解的不够深入,目前,自己只是在自己的项目中简单的应用了他最基本的功能,让他进行开辟线程 异步操作, 其中的map函数式编程 是他的主要应用.
RxJava 由三个部分组成 Observable可观察的对象 ,subscribe订阅者,Scheduler线程控制 .
他的流程上是:创建的Observable对象 ,所有Observer一旦订阅这个Observable就会立即调用onNext()方法并传入Observable.的的参数,而后因为Observable没有数据可以发送了,onComplete()方法会被调用。
Rxjava 的学习曲线之所以陡峭 ,是因为他的方法库太多,而且编程思想不同,例如在Observable
中 map, flatMap ,filter,doOnNext等等,
接下来 来介绍它的主要应用
1.RxAndroid 基本的应用(异步)
private void asyncSave() { saveObservable = Observable.fromCallable(new Callable<String>() { @Override public String call() throws Exception {//通知调用 并返回string return savePic(file, bitmap);//此方法在io线程中调用 并返回 } }); saveSubscription = saveObservable .subscribeOn(Schedulers.io())//observable在调度中的IO线程中进行调度进行 .observeOn(AndroidSchedulers.mainThread())//在主线程中进行观察 .subscribe(new Observer<String>() { //订阅观察者 @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(String s) {//带参数的下一步,在此就是当 textView.setText("saveSubscription: save sucessful ,the file name is " + s); } }); }
2.RxAndorid 中single应用
private void singleObservable() { Single<String> stringSingle = Single.fromCallable(new Callable<String>() { @Override public String call() throws Exception { return savePic(file, bitmap); } }); mSingleSubscriber = stringSingle .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new SingleSubscriber<String>() { @Override public void onSuccess(String value) { textView.setText("mSingleSubscriber: save sucessful ,the file name is " + value); } @Override public void onError(Throwable error) { } }); }
3.RxAndroid中map应用
private void createObservables() { mSearchResultsSubject = PublishSubject.create(); mTextWatchSubscription = mSearchResultsSubject .debounce(400, TimeUnit.MILLISECONDS)//去抖动 .observeOn(Schedulers.io()) .map(new Func1<String, List<String>>() {//map函数式编程 @Override public List<String> call(String s) { return mRestClient.searchForCity(s); } }) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<List<String>>() {//订阅并进行处理 @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(List<String> cities) {//这里的cities 是一个整体,next handleSearchResults(cities); } }); }
private void getFile(List<File> folders){// Observable.from(folders)//在后台,用来代替for循环,以及其中的逻辑判断 .flatMap(new Func1<File, Observable<File>>() { @Override public Observable<File> call(File file) {//将list 中的每一个都分别处理 好比foreach return Observable.from(file.listFiles()); } }) .filter(new Func1<File, Boolean>() {//过滤 @Override public Boolean call(File file) { return file.getName().endsWith(".png"); } }) .map(new Func1<File, Bitmap>() { @Override public Bitmap call(File file) { return getBitmapFromFile(file); } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<Bitmap>() { @Override public void call(Bitmap bitmap) {//list中的数据 一个个的next ImageView imageView =new ImageView(getBaseContext()); imageView.setImageBitmap(bitmap); imageCollectorView.addView(imageView); } }); }
4. 避免内存泄露
当activity结束时,要调用 如下, 避免内存泄露,因为涉及到线程问题时候,都会出现内存问题
@Override protected void onDestroy() { super.onDestroy(); if (mTextWatchSubscription != null && !mTextWatchSubscription.isUnsubscribed()) { mTextWatchSubscription.unsubscribe(); } }
Rxandroid 还有一些其他的用法,比如请求网络,rxBus等等,.在请求网络上 用volley ,xutils即可,在事件总线上,用eventBus,所以在此就不再讨论这些的情况
Rxandroid 是一个工具,一般用来替代handle 和asynctasic类这种容易引发内存泄露的方法,还有就是 用来简化代码逻辑结构,
我想仅对于应用层面,上面这些应该够用了,写这篇文章,是为了我们更好的学习, 欢迎大家指正,提问~
关于rxandroid 更深层次的问题,还希望我们一起共同探索,我也会在后期的博文中继续研究其中的原理~~
大家一起努力吧!!!
关于项目的Demo(写了那么多,也不容易,给个赞吧~~~谢谢) :https://github.com/ccj659/myRxAndroid.git