一、基本使用三部曲
依赖:
compile 'io.reactivex.rxjava2:rxjava:2.0.0-RC5' compile 'io.reactivex.rxjava2:rxandroid:2.0.0-RC1'
compile 'com.squareup.retrofit2:retrofit:2.1.0' compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2'
1、创建Observable
io.reactivex.Observable<String> observable= io.reactivex.Observable .create(new ObservableOnSubscribe<String>() { @Override public void subscribe(ObservableEmitter<String> e) throws Exception { e.onNext("hello"); e.onNext("world"); e.onComplete(); } });
2、创建Observer
Observer<String> observer=new Observer<String>() { @Override public void onSubscribe(Disposable d) { Log.d("TestRxJava", "onSubscribe: "+d.isDisposed()); } @Override public void onNext(String value) { Log.d("TestRxJava", "onNext: "+value); } @Override public void onError(Throwable e) { Log.d("TestRxJava", "onError: "+e.getLocalizedMessage()); } @Override public void onComplete() { Log.d("TestRxJava", "onComplete: "); } };
3、订阅
observable.subscribe(observer);
简单写法
getObservable().subscribe(new Consumer<String>() { @Override public void accept(String s) throws Exception { txt1.append("accept:value:"+s); txt1.append(LINE_SEPARATOR); } });
二、Scheduler线程控制
Schedulers.immediate();直接在当前线程运行,相当于不指定线程。这是默认的Scheduler。
Schedulers.newThread();总是启用新线程,并在新线程执行操作。
Schedulers.io();I/O操作(读写文件、读写数据库、网络信息交互等)所使用的Scheduler。行为模式和newThread()差不多,区别在于io()的内部实现是用一个无数量上限的线程池,可以重用空闲的线程,因此多数情况下io()比newThread()更有效率。不要把计算工作放在io()中,可以避免创建不必要的线程。
Schedulers.computation();计算所使用的Scheduler。这个计算指的是CPU密集型计算,即不会被I/O等操作限制性能的操作,例如图形的计算。这个Scheduler使用的固定的线程池,大小为CPU核数。不要把I/O操作放在computation()中,否则I/O操作的等待时间会浪费CPU。
AndroidSchedulers.mainThread();它指定的操作将在Android主线程运行
例如:
Observable.create(new ObservableOnSubscribe<User>() { @Override //主线程执行 public void subscribe(ObservableEmitter<User> emitter) throws Exception { User user=api.getUserInfo(1).execute().body(); // User user = new User("1", "cniao5.com"); emitter.onNext(user); } }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<User>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(User user) { Log.d("MainActivity", "onNext: " + user); txt1.setText(user.getUsername()); } @Override public void onError(Throwable e) { e.printStackTrace(); } @Override public void onComplete() { } });
observeOn()指定Observer线程; subscribeOn()指定Observable线程;