本文通过麦子学院的视频所学☺
牢牢记住:
Observable:被观察者
Subscriber:观察者
一.使用方法:
1.方法1:
Observable observable = Observable.create(new Observable.OnSubscribe() {
@Override
public void call(Subscriber super String> subscriber) {
subscriber.onNext("Method one");
}
});
Subscriber subscriber=new Subscriber() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String o) {
tv.setText(o);
}
};
observable.subscribe(subscriber);
至此:textView中即可显示出Method one
2.方法2:
Observable observable = Observable.create(new Observable.OnSubscribe() {
@Override
public void call(Subscriber super String> subscriber) {
subscriber.onNext("Method two");
}
});
observable.subscribe(new Action1() {
@Override
public void call(String o) {
tv.setText(Method two+"123");
}
});
至此:textView中,可显示出Method two拼接上123,即Method two123
3.方法3:
Observable observable=Observable.just("Method three");
observable.subscribe(new Action1() {
@Override
public void call(String o) {
tv.setText(o);
}
});
至此:textView中即可显示出Method three
4.方法4:(简单并常用):
Observable.just("Method Four").subscribe(new Action1() {
@Override
public void call(String s) {
tv.setText(s);
}
});
5.方法5:(使用lambda表达式):
(1)AS接入(前提是要用Java8,若是不对,应上网下载,并配置)
在app-build.gradle中,andrdoid层级中写
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
(2)进行同步,会发现报错,报错信息如下
Error:Jack is required to support java 8 language features. Either enable Jack or remove sourceCompatibility JavaVersion.VERSION_1_8.
解决方法:
jackOptions {
enabled true
}
具体位置:
再次同步,就可以解决了
(3)lambda表达式写法
Observable.just("lambda").subscribe(s -> tv.setText(s));
至此:textView中,可显示出lambda
二.操作符部分:
1.map(将一个类型转换成另一个类型,并可多次转换)
(1)map的单次变换(从String -> Integer)
Observable.just("map").map(new Func1() {
@Override
public Integer call(String s) {
return s.hashCode();
}
}).subscribe(s -> tv.setText(s.toString()));
至此:textView中,可显示出"map"的hashcode值,并且是integer类型的
(2)map的多次变换(从String -> Integer)
Observable.just("多次变换").map(new Func1() {
@Override
public Integer call(String s) {
return 2017;
}
}).map(new Func1() {
@Override
public String call(Integer integer) {
return String.valueOf(integer);
}
}).subscribe(s -> textView.setText(s));
至此:我们输入的字符串“多次变换”,先是通过map将String类型转换成Integer的2017,再次通过map得到字符串"2017",最后显示到textView中
2.from(类似for循环的逐个输出)
List mList;
mList = Arrays.asList("1", "2", "3", "4");
Observable.from(mList).subscribe(new Action1() {
@Override
public void call(String s) {
System.out.println(s);
}
});
至此:会在控制台中逐个打印出1,2,3,4
3.flatMap(接收一个Observable的输出作为输入,同时输出另一个Observable)
(1)写一个方法,返回Observable对象
private Observable> add() {
return Observable.just(Arrays.asList("999", "888", "333", "444"));
}
(2)将add()方法的输出作为输入
add().flatMap(new Func1, Observable>() {
@Override
public Observable call(List list) {
return Observable.from(list);
}
}).subscribe(s -> System.out.println(s));
至此:会在控制台中逐个打印出999,888,333,444
4.take(指定最多输出的数量,类似取其中的前几个)
add()参考上面第三个中有。
add().flatMap(new Func1, Observable>() {
@Override
public Observable call(List list) {
return Observable.from(list);
}
}).take(2).subscribe(s -> System.out.println(s));
至此:会在控制台中逐个打印出集合前两个,999,888
5.Filter(留下符合条件的,过滤掉不符合条件的)
add()参考上面第三个中有。
add().flatMap(new Func1, Observable>() {
@Override
public Observable call(List list) {
return Observable.from(list);
}
}).filter(new Func1() {
@Override
public Boolean call(String s) {
return Integer.parseInt(s)>444;
}
}).subscribe(s -> System.out.println(s));
至此:会在控制台中逐个打印出大于444的数,999,888
6.doOnNext(每次输出一个元素之前额外做的事)
add()参考上面第三个中有。
add().flatMap(new Func1, Observable>() {
@Override
public Observable call(List list) {
return Observable.from(list);
}
}).doOnNext(new Action1() {
@Override
public void call(String s) {
System.out.println("11:"+s);
}
}).subscribe(s -> System.out.println("22:"+s));
至此:会在控制台中输出为: 11:999 22:999 11:888 22:888 11:333 22:333 11:444 22:444
分享完毕,开年第一篇,今年要坚持写作,不仅自己记录,并且希望能帮助到你❀