当子线程处理某个逻辑要在主线程显示的时候使用。
Observable.just(currentBytesCount).observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1() {
@Override
public void call(Long aLong) {
tvMsg.setText("提示:上传中");
progressBar.setMax((int) totalBytesCount);
progressBar.setProgress((int) currentBytesCount);
}
});
清神咒
! 我感觉吧,也许Rx之所以让人感觉恐惧学习成本高,是因为被一些术语绕来绕去绕晕了,术语太抽象,不接近生活本质、很难理解,或者记忆深刻,什么发射,什么观察者、被观察者、什么onNext
,但是我一直被这些文章吓得不轻,也被这单词绕来绕去绕晕了,产生了恐惧中,什么观察啊被观察头都晕了,现在我撸了屡,通熟易懂的来说 来本质无非就是 添加一个回调到一个操作类里面,执行这个操作类的时候的时候会遍历调用这些回调, 只是执行的时候可以设置在主线程回调还是子线程回调 以及自己的任务是在主线程执行还是子线程执行
2、没有学以致用,或者不知道什么时候用,应该把什么东西改成什么。
单词介绍和转换概念加深印象
这里不得不说一个事情,就是记忆的技巧,如果你觉得一个东西太过抽象,但是要想不对他产生恐惧,而且想轻松记下来,不会搞混淆,搞反,你应该把它变成你熟悉的业务,这样方便你一气呵成,而不是扭啊扭的被术语绕晕。
观察者Observer
1、把它理解操作类
2、把它业务逻辑类
3、强加一个印象,他音乐播放器的具体实现类代码类
4、管理这些回调/处理的逻辑回调的类
5、发布事件的 ,上游
被观察者Observable
1、把它理解为一个回调
2、把它理解为业务逻辑最终执行的你想知道的一个方法活多个监听接口
3、把它理解为一个音乐播放器的进度播放回调、暂停回调。
4、 下游、一般用于主线程
5、接受时间的
订阅 Subscribe
就是把Observer
添加到Observable
中持有,这样有点饶了,那么换通熟易懂一点。
1、把回调添加到这个控制器的回调接口列表,它会在适当的时机回调它。
2、给就是音乐播放器的控制类设置一个回调、可以设置一个或者多个。
示例
import java.util.Arrays;
import io.reactivex.Flowable;
import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.ObservableOperator;
import io.reactivex.ObservableSource;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Action;
import io.reactivex.functions.Consumer;
import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers;
/**
* Created by qssq on 2018/11/14 [email protected]
*/
public class Main {
public static void print(String str) {
System.out.println("Main.print:" + str);
}
public void print_obj(String str) {
System.out.println("Main.print_obj:" + str);
}
public static void main(String[] args) {
System.out.println("hllll");
// testObservableSimple();
/* Observable.fromArray(new byte[]{11111})
.flatMap((Func1) (folder) -> {
Observable.from(file.listFiles())
})
.filter((Func1) (file) -> {
file.getName().endsWith(".png")
})
.map((Func1) (file) -> {
getBitmapFromFile(file)
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe((Action1) (bitmap) -> {
imageCollectorView.addImage(bitmap)
});*/
// testObservable1();
/* Subscriber subscriber = new Subscriber() {
@Override
public void onSubscribe(Subscription s) {
}
@Override
public void onNext(Course course) {
}
@Override
public void onError(Throwable t) {
}
@Override
public void onComplete() {
}
};*/
// testOneObjectMultiChild();
// testLift();
// testSmiple();
try {
Thread.sleep(8000);
} catch (Exception e) {
}
}
private static void testLift() {//据说也属于变黄。
Observable.just(1, 2, 3, 50, 60)//打印 1 2 3 4,
.lift(new ObservableOperator() { //lift 举起 鼓舞 如果没有使用list,那么 这interger 最后接受的也只能是int,而用这个就实现了变换。 泛型 左边 为 要转换的类型,右边则表示之前的类型 这里必须写成integer,因为之前fajust返回的以及是integer了。
@Override
public Observer super Integer> apply(Observer super String> observer) throws Exception {
return new Observer() {
@Override
public void onSubscribe(Disposable d) {
observer.onSubscribe(d);
}
@Override
public void onNext(Integer integer) {
observer.onNext("数字10" + integer + "的16进制为;" + Integer.toHexString(integer));
}
@Override
public void onError(Throwable e) {
observer.onError(e);
}
@Override
public void onComplete() {
observer.onComplete();
}
};
}
})
.subscribeOn(Schedulers.io()) // 指定 subscribe() 发生在 IO 线程 导致不打印
.observeOn(Schedulers.newThread()) // 指定 Subscriber 的回调发生在主线程
.subscribe(new Consumer() {
@Override
public void accept(String o) throws Exception {
System.out.println("lift结果:" + o);
}
});
}
private static void testOneObjectMultiChild() {
//遍历 一对多 所有学生的所学的课程 ,默认是 英语 数学, 张三除外。一对多关系。 map和 flatMap的区别。
Student[] students = new Student[]{Student.newInstance("张三").setCourses(new Course[]{Course.newInstance("德语"), Course.newInstance("日语")}), Student.newInstance("李四"), Student.newInstance("王老五"), Student.newInstance("某某")};
Observable.fromArray(students)
.flatMap(new Function>() {
@Override
public ObservableSource apply(Student student) throws Exception {
return Observable.fromArray(student.getCourses());//flatMap是1对多, 而map只能1对1 返回。
}
})
.subscribe(new Consumer() {
@Override
public void accept(Course course) throws Exception {
System.out.println("课程:" + course.getName());
}
});
}
public static class Course {
public String getName() {
return name;
}
public Course(String name) {
this.name = name;
}
public Course() {
}
public void setName(String name) {
this.name = name;
}
public static Course newInstance(String name) {
return new Course(name);
}
String name;
}
public static class Student {
private Course[] courses = new Course[]{Course.newInstance("英语"), Course.newInstance("数学")};
public String getName() {
return name;
}
public Student() {
}
private String name;
public Student(String name) {
this.name = name;
}
public static Student newInstance(String name) {
return new Student(name);
}
public static Student newInstance(String name, Course[] courses) {
return new Student(name).setCourses(courses);
}
public Student setCourses(Course[] courses) {
this.courses = courses;
return this;
}
public Course[] getCourses() {
return courses;
}
}
private static void testSmiple() {
Flowable.just("Hello world").subscribe(System.out::println);//表示调用System.out.println来接受字符串 ()
Flowable.just("Hello world").subscribe(new Main()::print_obj);//自己定义的方法 非静态
Flowable.just("Hello world").subscribe(Main::print);//自己定义的方法,为静态
Flowable.just("Hello world").subscribe(new Consumer() {//这种写法等价。
@Override
public void accept(String s) throws Exception {
System.out.println("" + s);
}
});
Flowable.just("Hello world").subscribe(new Consumer() {
@Override
public void accept(String s) throws Exception {
System.out.println("" + s);
}
});
/*
Flowable.fromCallable(new Callable