首先 在这里放上两个库的地址
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() {
@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() { //订阅观察者
@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 stringSingle = Single.fromCallable(new Callable() {
@Override
public String call() throws Exception {
return savePic(file, bitmap);
}
});
mSingleSubscriber = stringSingle
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SingleSubscriber() {
@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>() {//map函数式编程
@Override
public List call(String s) {
return mRestClient.searchForCity(s);
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer>() {//订阅并进行处理
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(List cities) {//这里的cities 是一个整体,next
handleSearchResults(cities);
}
});
}
private void getFile(List folders){//
Observable.from(folders)//在后台,用来代替for循环,以及其中的逻辑判断
.flatMap(new Func1>() {
@Override
public Observable call(File file) {//将list 中的每一个都分别处理 好比foreach
return Observable.from(file.listFiles());
}
})
.filter(new Func1() {//过滤
@Override
public Boolean call(File file) {
return file.getName().endsWith(".png");
}
})
.map(new Func1() {
@Override
public Bitmap call(File file) {
return getBitmapFromFile(file);
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1() {
@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