上一篇介绍了RxAndroid最基本的使用,这篇将介绍一下RxAndroid的操作符,也是实现链式结构的核心api。
常用的操作符主要有以下几种:
map操作符:主要是用于对象间类型的转换,如一下例子,将byte数组转换成了String类型
byte [] b=new byte[]{'a','b'};
byte [] b2=new byte[]{'c','d'};
Observable.just(b,b2) //所有byte数组都的都执行
.map(new Func1<byte[], String>() {
@Override
public String call(byte[] bytes) {
return new String(bytes);
}
})
.subscribe(new Action1<String>() { //action1 只是在只调用onnext 时能使用
@Override
public void call(String s) {
Toast.makeText(MainActivity.this,s,Toast.LENGTH_SHORT).show();
}
});
flatMap的操作符:比较复杂的一个操作符,是通过一个observalbe调用另外一个Obervable对象。
String [][] s=new String[][]{{"11","12","13"},{"21","22","23"}};
/* Observable.from(s).flatMap(new Func1<String[], Observable<String>>() {
@Override
public Observable<String> call(String[] s) {
Log.e("Mainactivity",""+11111);
for (String a:s
) {
Log.e("Mainactivity",""+a);
}
Log.e("Mainactivity","-------");
return Observable.from(s);
}
}).subscribe(new Action1<String>() {
@Override
public void call(String s) {
Toast.makeText(MainActivity.this,s,Toast.LENGTH_SHORT).show();
}
});*/
//------------------------------华丽的分割线----------------------------------------------------
//转换了数据类型
//注意 flatmap的操作符中需要返回一个Observable.from()类型 而Observable.from()需要一个iterable类型的参数
Observable.from(s).flatMap(new Func1<String[], Observable<Integer>>() {
@Override
public Observable<Integer> call(String[] s) {
Log.e("Mainactivity",""+11111);
for (String a:s
) {
Log.e("Mainactivity",""+a);
}
Log.e("Mainactivity","-------");
return toInteger(s);
}
}).subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {<pre name="code" class="java">
filter操作符:顾名思义,过滤想要的。
String [] sss=new String[]{"你是傻逼吗","我不是","你才是"};
Observable.from(sss)
.filter(new Func1<String, Boolean>() {
@Override
public Boolean call(String s) {
return !"我不是".equals(s);
}
})
.doOnCompleted(new Action0() {
@Override
public void call() {//所有的执行完成才会执行此方法 在数据更新之后可以安全使用更新ui
Log.e("aaaa","aa执行完了");
}
})
.doOnError(new Action1<Throwable>() { //不起作用? 待考证
@Override
public void call(Throwable throwable) {
Log.e("aaaa","aa执行错误了");
}
})
.doOnNext(new Action1<String>() {
@Override
public void call(String s) {
try {
Log.e("aaaa","aa休息了");
Thread.sleep(1000); //测试执行的先后顺序 测试时可以调大一点方便测试
} catch (Exception e) {
e.printStackTrace();
}
Toast.makeText(MainActivity.this,s+"a",Toast.LENGTH_SHORT).show();
}
})//执行其他操作 这是串行的需要 执行完成后才执行其他的
.take(3)//过滤后需要的数量
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
Log.e("bbbb","bb");
// Toast.makeText(MainActivity.this,s,Toast.LENGTH_SHORT).show();
}
});
filter比较简单,没有单一的介绍filter的使用,混合了一些其他的api,代码中注释详细,不做过多的解释。比较常用的操作符基本就是这些,以后学了更多的之后再来补充。测试代码之前发过,还是再发一遍:
补充:关于原理可以查看这篇文章→给 Android 开发者的 RxJava 详解 写的比我详细多了,刚开始写博客心比较浮躁,希望以后会改掉这毛病吧。