3.RxJava详解
异步(取代AsyncTask/Handler/XXX/...?)
简洁(逻辑的简洁,.一步一走)
举例:
题目:将文件夹中的图片都取出来,放到界面上显示。
1.Thread
new Thread() { @Override public void run() { super.run(); for (File folder : folders) { File[] files = folder.listFiles(); for (File file : files) { if (file.getName().endsWith(".png")) { final Bitmap bitmap = getBitmapFromFile(file); getActivity().runOnUiThread(new Runnable() { @Override public void run() { imageCollectorView.addImage(bitmap); } }); } } } }}.start();Observable.from(folders) .flatMap(new Func1<File, Observable<File>>() { @Override public Observable<File> call(File file) { return Observable.from(file.listFiles()); } }) .filter(new Func1<File, Boolean>() { @Override public Boolean call(File file) { return file.getName().endsWith(".png"); } }) .map(new Func1<File, Bitmap>() { @Override public Bitmap call(File file) { return getBitmapFromFile(file); } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<Bitmap>() { @Override public void call(Bitmap bitmap) { imageCollectorView.addImage(bitmap); } });1.概念:扩展的观察者模式
1)观察者模式:
观察者通过 注册(Register)或者称为订阅(Subscribe)的方式,通过警报,让被观察者发生某种行为的时候,通知一下观察者。
例如:onClickListener():view按钮被点击的时候,view相当于被观察者,就会触发onClickListener的监听,通知调用OnClick被观察者,两者是通过setOnClickListner订阅的。
2)RxJava的观察者模式
RxJava有4个基本概念:Observable(被观察者),Observer(观察者),subscribe(订阅),onNext()...->onCompleted()/onError()(事件)。

2.基本实现
1)创建Observer:它决定事件触发的时候有怎样的行动。(new)
①
Observer<String> observer = new Observer<String>() { @Override public void onNext(String s) { Log.d(tag, "Item: " + s); } @Override public void onCompleted() { Log.d(tag, "Completed!"); } @Override public void onError(Throwable e) { Log.d(tag, "Error!"); }};②实现了Observer的抽象类Subscriber:
Subscriber<String> subscriber = new Subscriber<String>() { @Override public void onNext(String s) { Log.d(tag, "Item: " + s); } @Override public void onCompleted() { Log.d(tag, "Completed!"); } @Override public void onError(Throwable e) { Log.d(tag, "Error!"); }};Subscriber比Observer多的东西:
onStart():在事件未发生之前调用,准备工作,执行在工作线程;doOnAubscribe()指定线程来做准备工作。
unsubscribe()取消订阅,在onStop()方法里边调用,释放资源,防止内存泄露。
2)创建Observable:它决定什么时候触发事件,触发怎样的事件。(onCreate())
Observable observable = Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { subscriber.onNext("Hello"); subscriber.onNext("Hi"); subscriber.onNext("Aloha"); subscriber.onCompleted(); }});简单写法:
Observable observable = Observable.just("Hello", "Hi", "Aloha"); String[] words = {"Hello", "Hi", "Aloha"}; Observable observable = Observable.from(words);3)subscribe(订阅)
observable.subscribe(observer);// 或者:observable.subscribe(subscriber);注:Observable.subscribe(subscriber)订阅的内部实现:
public Subscription subscribe(Subscriber subscriber) { subscriber.onStart(); //准备 onSubscribe.call(subscriber); //事件发送的逻辑开始 return subscriber; //返回监听对象}
除了 subscribe(Observer) 和 subscribe(Subscriber) ,subscribe() 还支持不完整定义的回调,RxJava 会自动根据定义创建出Subscriber 。形式如下:
Action1<String> onNextAction = new Action1<String>() { // onNext() @Override public void call(String s) { Log.d(tag, s); }};Action1<Throwable> onErrorAction = new Action1<Throwable>() { // onError() @Override public void call(Throwable throwable) { // Error handling }};Action0 onCompletedAction = new Action0() { // onCompleted() @Override public void call() { Log.d(tag, "completed"); }};// 自动创建 Subscriber ,并使用 onNextAction 来定义 onNext()observable.subscribe(onNextAction);// 自动创建 Subscriber ,并使用 onNextAction 和 onErrorAction 来定义 onNext() 和 onError()observable.subscribe(onNextAction, onErrorAction);// 自动创建 Subscriber ,并使用 onNextAction、 onErrorAction 和 onCompletedAction 来定义 onNext()、 onError() 和 onCompleted()observable.subscribe(onNextAction, onErrorAction, onCompletedAction);实例:
由id取得图片并显示
int drawableRes = ...;ImageView imageView = ...;Observable.create(new OnSubscribe<Drawable>() { @Override public void call(Subscriber<? super Drawable> subscriber) { Drawable drawable = getTheme().getDrawable(drawableRes)); subscriber.onNext(drawable); subscriber.onCompleted(); }}).subscribe(new Observer<Drawable>() { @Override public void onNext(Drawable drawable) { imageView.setImageDrawable(drawable); } @Override public void onCompleted() { } @Override public void onError(Throwable e) { Toast.makeText(activity, "Error!", Toast.LENGTH_SHORT).show(); }});3.线程控制——Scheduler(调度器)
在不指定线程的情况下,RxJava遵循线程不变的原则。(在哪个线程调用subscribe(),就在哪个线程生产事件,消费事件)
1)Scheduler的API
- Schedulers.immediate():当前线程。
- Schedulers.newThread():新启线程。
- Schedulers.io(): I/O 操作(读写文件、读写数据库、网络信息交互等)所使用的 Scheduler。(*)
- Schedulers.computation(): 计算所使用的 Scheduler。
- AndroidSchedulers.mainThread(),它指定的操作将在 Android 主线程运行。
- subscribeOn(): 指定 subscribe() 所发生的线程,即 Observable.OnSubscribe 被激活时所处的线程。或者叫做事件产生的线程。
- observeOn(): 指定 Subscriber 所运行在的线程。或者叫做事件消费的线程。
Observable.just(1, 2, 3, 4) .subscribeOn(Schedulers.io()) // 指定 subscribe() 发生在 IO 线程 .observeOn(AndroidSchedulers.mainThread()) // 指定 Subscriber 的回调发生在主线程 .subscribe(new Action1<Integer>() { @Override public void call(Integer number) { Log.d(tag, "number:" + number); } });

浙公网安备 33010602011771号