最近Retrofit+Rxjava在android网络请求框架中脱颖而出,受到很多兄弟们的欢迎。在之前公司走的时候一部分网络框架已经替换成这个,但是由于不是负责的这个模块,所以只是粗略的了解一下,所以现在来进一步的了解一下这个框架的应用。
大概看了几篇博客和一些资料先自我总结一下:
Rxjava就是所谓的链式结构,主要以观察者模式来开发,可以让整个业务流程更加清晰,便于代码的可读性和可维护性,随着逻辑复杂,但是结构更加清晰。
下面先来了解一下RxJava基本使用方法
现在gradle文件中添加依赖
compile 'io.reactivex:rxandroid:1.1.0'
compile 'io.reactivex:rxjava:1.1.5'
然后了解一下rxjava中的几个名词
Observable被观察者 Observer观察者 Subscriber订阅 Observable和 Observer 通过Subscriber实现订阅关系
基本用法
1.定义Obervable
Observable<String > observable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("hello world");
subscriber.onCompleted();
}
});
这样简单的数据传递模式,我们还可以通过以下方式对Observable进行定义
Observable<String> myObservable = Observable.just("hello world");
其返回对象也为Observable,可以大致看下源码
public static <T> Observable<T> just(final T value) {
return ScalarSynchronousObservable.create(value);
}
2.定义Observe
Subscriber<String> subscriber = new Subscriber<String>() {
@Override
public void onStart() {
}
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
}
};
这里的Subscriber是对Observe进行了扩展,增加了onStart()方法,它是在事件未发生之前执行,可以用来做一些初始化工作。其他方法和obersve方法使用保持一直
这里的Observe也可支持不完整的定义Action0 he Actiion1
Action1<String> onNextAction = new Action1<String>() {
@Override
public void call(String s) {
Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
}
};
这里的Aciotn1只有一个方法call(),只能传一个参数无返回值。还有类似Action0也只有一个方法call(),但是无参数无返回值;
3.订阅
observable.subscribe(subscriber);
或者
myObservable.subscribe(onNextAction);
4.map操作符数据转化
Observable.just("hello world").map(new Func1<String, String>() {
@Override
public String call(String s) {
return s+"my heart";
}
}).subscribe(new Action1<String>() {
@Override
public void call(String s) {
Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
}
});
这里正是rxjava的强大之处,可以通过map操作符进行转化,在我们正常的应用过程中我们也可以通过map操作符对数据进行处理,通过这种链式结果使我们的整个代码结果没有太大的影响,依然美观
以前我们在处理List数据的时候很多情况下要进行for循环,如果数据结果比较复杂的话,几个for循环套在一起,可能导致会出现一些不经意的错误,而且代码的可读性和可维护性都会降低,那么我们尝试用Rxjava的操作符来进行数据的处理
query("helloWorld")
.flatMap(new Func1<List<String>, Observable<String>>() {
@Override
public Observable<String> call(List<String> strings) {
return Observable.from(strings);
}
})
.flatMap(new Func1<String, Observable<String>>() {
@Override
public Observable<String> call(String s) {
return getTitle(s);
}
})
.filter(new Func1<String, Boolean>() { //过滤掉不满足条件的
@Override
public Boolean call(String s) {
return s!=null;
}
})
.take(5) //输出指定数量的结果
.doOnNext(new Action1<String>() {
@Override
public void call(String s) { //在每次输出前做一些额外的操作
Log.d("MainActivity","输出前对数据做一些操作");
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
}
});
这样的话可能看起来我们的代码变多了,但是我们的结果依旧清晰,就算结果数据复杂也不影响我们数据的可读性。
当然了我写的这些只是对map操作符的一些简单使用,更多,更强大的功能我们在后面的学习过程中在进行挖掘。
5线程切换
因为在andriod开发过程中,主线程中不能进行耗时操作,不然会引起程序crash。当然使用最多的是我们在进行网络请求的时候,之前会new Runable,或者使 用AsynTask但是,就个人使用感觉有点麻烦,后来Volley推出了,用了挺长一段时间,但是相比较而言感觉还是rxjava的这种线程切换方式更加方便。
Observable.just("hello","sdfsf", "sdfdf", "wrt")
.subscribeOn(Schedulers.io()) // 指定 subscribe() 发生在 IO 线程
.observeOn(AndroidSchedulers.mainThread()) // 指定 Subscriber 的回调发生在主线程
.subscribe(new Action1<String>() {
@Override
public void call(String str) {
Log.d(tag, "String:" + str);
}
});
subscribeOn用来指定io线程执行耗时操作,observeOn切换到主线程,执行非耗时性操作!