Observable(被觀察者,發射器)發送數據:java
just:發送單個的數據;數據庫
Observable.just("cui","chen","bo") .subscribe(new Consumer<String>() { @Override public void accept(String s) throws Exception { Log.i(TAG, "accept: "+s); } });
Log:網絡
04-27 22:44:05.988 7317-7317/com.ccb.pactera.rxdemo I/MainActivity: accept: cui
04-27 22:44:05.988 7317-7317/com.ccb.pactera.rxdemo I/MainActivity: accept: chen
app
04-27 22:44:05.988 7317-7317/com.ccb.pactera.rxdemo I/MainActivity: accept: boide
fromIterable:發送集合類型的數據;性能
List<String> datas = Arrays.asList("H","W","Rx"); Observable.fromIterable(datas) .subscribe(new Observer<String>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(String value) { Log.i(TAG, "onNext: "+value); } @Override public void onError(Throwable e) { } @Override public void onComplete() { } });
Log:ui
04-27 22:44:05.988 7317-7317/com.ccb.pactera.rxdemo I/MainActivity: onNext: H
04-27 22:44:05.988 7317-7317/com.ccb.pactera.rxdemo I/MainActivity: onNext: W
this
04-27 22:44:05.988 7317-7317/com.ccb.pactera.rxdemo I/MainActivity: onNext: Rxspa
數據轉換:線程
map:一對一的轉換;
final Integer icon = R.mipmap.ic_launcher_round; //數據轉換 Observable.create(new ObservableOnSubscribe<Integer>() { @Override public void subscribe(ObservableEmitter<Integer> e) throws Exception { e.onNext(icon); e.onComplete(); } }) .map(new Function<Integer, Drawable>() { @Override public Drawable apply(Integer integer) throws Exception { return getResources().getDrawable(integer); } }) .subscribe(new Observer<Drawable>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(Drawable value) { ImageView iv = new ImageView(MainActivity.this); iv.setImageDrawable(value); } @Override public void onError(Throwable e) { } @Override public void onComplete() { } });
flatMap:一對多的轉換;
public class Course { private String name; private int id; public Course(String name, int id) { this.name = name; this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } } public class Student { private String name; private ArrayList<Course> courses; public Student(String name, ArrayList<Course> courses) { this.name = name; this.courses = courses; } public String getName() { return name; } public void setName(String name) { this.name = name; } public ArrayList<Course> getCourses() { return courses; } public void setCourses(ArrayList<Course> courses) { this.courses = courses; } }
Course yuwen = new Course("語文", 1); Course shuxue = new Course("數學", 2); Course yingyu = new Course("英文", 3); Course lishi = new Course("歷史", 4); Course zhengzhi = new Course("政治", 5); Course xila = new Course("希臘語", 6); ArrayList<Course> course1 = new ArrayList<>(); course1.add(yuwen); course1.add(shuxue); course1.add(yingyu); course1.add(lishi); course1.add(zhengzhi); course1.add(xila); Student zhangsan = new Student("zhangsan", course1); Observable.just(zhangsan) .flatMap(new Function<Student, ObservableSource<Course>>() { @Override public ObservableSource<Course> apply(Student student) throws Exception { return Observable.fromIterable(student.getCourses()); } }) .subscribe(new Consumer<Course>() { @Override public void accept(Course course) throws Exception { Log.i(TAG, "accept: "+course.getName()); } });
Log:
04-27 23:12:50.084 11652-11652/? I/MainActivity: accept: 語文
04-27 23:12:50.084 11652-11652/? I/MainActivity: accept: 數學
04-27 23:12:50.084 11652-11652/? I/MainActivity: accept: 英文
04-27 23:12:50.084 11652-11652/? I/MainActivity: accept: 歷史
04-27 23:12:50.084 11652-11652/? I/MainActivity: accept: 政治
04-27 23:12:50.084 11652-11652/? I/MainActivity: accept: 希臘語
線程切換:
默認:
Observable.just("CCB") .subscribe(new Consumer<String>() { @Override public void accept(String s) throws Exception { Log.i(TAG, "accept: ---"+s+"--線程--"+Thread.currentThread()); } });
Log:
MainActivity: accept: ---CCB--線程--main (主線程);
添加subscribeOn(Schedulers.io());後;Log:MainActivity: accept: ---CCB--線程--RxCachedThreadScheduler-1 (子線程)
Observable.just("CCB") .subscribeOn(Schedulers.io()) .subscribe(new Consumer<String>() { @Override public void accept(String s) throws Exception { Log.i(TAG, "accept: ---"+s+"--線程--"+Thread.currentThread()); } });
再添加: .observeOn(AndroidSchedulers.mainThread())後;log:MainActivity: accept: ---CCB--線程--main (主線程);
Observable.just("CCB") .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer<String>() { @Override public void accept(String s) throws Exception { Log.i(TAG, "accept: ---"+s+"--線程--"+Thread.currentThread()); } });
這樣咱們就能夠把一些耗時的操做(加載圖片、網絡請求)放在子線程,而後更新界面的時候再切換到主線程;各類線程間的切換隻須要一行代碼就能夠搞定,並且鏈式調用,思路清晰;
OK!Rxjava的線程切換以及數據轉換就說完了。