观察者模式
下面写了一个简单例子,实现图片的异步加载。
首先实现一个Observer对象,用来接收数据,更新图片内容。
onNext方法接收一个Bitmap对象。
public class RxObserver implements Observer {
private static final String TAG = "RxObserver";
private ImageView imageView;
public void setImageView(ImageView img) {
imageView = img;
}
@Override
public void onSubscribe(@NonNull Disposable d) {
Log.d(TAG, "onSubscribe");
}
@Override
public void onNext(Object o) {
Log.d(TAG, "onNext " + o.toString());
imageView.setImageBitmap((Bitmap) o);
}
@Override
public void onError(@NonNull Throwable e) {
Log.d(TAG, "onError " + e);
}
@Override
public void onComplete() {
Log.d(TAG, "onComplete");
}
}
然后实现一个Observable对象,被观察者,用来提供数据。
private static class RxObservable implements ObservableOnSubscribe {
private Object data;
public RxObservable(Object obj) {
data = obj;
}
@Override
public void subscribe(@NonNull ObservableEmitter emitter) throws Throwable {
Log.d(TAG, "subscribe");
emitter.onNext(data);
emitter.onComplete();
}
}
最后通过subscribe方法,连接被观察者和观察者,传递数据。
private void loadImg() {
new Thread(new Runnable() {
@Override
public void run() {
InputStream is = null;
try {
is = openFileInput("疯狂动物城.jpg");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Bitmap bitmap = BitmapFactory.decodeStream(is);
RxHelper.getObservable(bitmap).subscribe(observer);
}
}).start();
}
参考
Android Rxjava:这是一篇 清晰 & 易懂的Rxjava 入门教程
GitHub地址
RxJava 多线程控制
Android RxJava:手把手教你使用RxJava
详解Android RxJava的使用