RxJava 初探

1,560 阅读3分钟
原文链接: blog.csdn.net

目录

入门教程推荐

  1. RxJava、Retrofit
    www.jianshu.com/p/19cac3c5b…
    gank.io/post/560e15…
    gank.io/post/56e80c…

  2. RxJava 操作符
    blog.csdn.net/job_hesc/ar…
    www.apkdv.com/rxjava-oper…
    ReactiveX中文翻译文档(这个特别推荐)
    mcxiaoke.gitbooks.io/rxdocs/cont…

RxJava的观察者模式关系

RxJava 有四个基本概念:Observable (可观察者,即被观察者)、 Observer (观察者)、 subscribe (订阅)、事件。Observable 和 Observer 通过 subscribe() 方法实现订阅关系,从而 Observable 可以在需要的时候发出事件来通知 Observer。

Observer 即观察者,它决定事件触发的时候将有怎样的行为
Observable 即被观察者,它决定什么时候触发事件以及触发怎样的事件

eg.

警察    :观察者
小偷    :被观察者

警察已经在小偷住的房间周围布满了监控,监视着小偷(订阅),只要小偷作案了(什么时候触发,触发做什么案件),就会被警察发现,警察就自然会开启抓捕行动(小偷的作案的事件触发了他,将会采取抓捕行动)。

大概就这样。

RxJava 与常规用法简明对比

假设有这样一个需求:界面上有一个自定义的视图 imageCollectorView ,它的作用是显示多张图片,并能使用 addImage(Bitmap) 方法来任意增加显示的图片。现在需要程序将一个给出的目录数组 File[] folders 中每个目录下的 png 图片都加载出来并显示在imageCollectorView 中。需要注意的是,由于读取图片的这一过程较为耗时,需要放在后台执行,而图片的显示则必须在 UI 线程执行。常用的实现方式有多种,其中一种:

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();

而如果使用 RxJava ,实现方式是这样的:

Observable.from(folders)
.flatMap(new Func1>() {
@Override
public Observable call(File file) {
return Observable.from(file.listFiles());
}
})
.filter(new Func1() {
@Override
public Boolean call(File file) {
return file.getName().endsWith(".png");
}
})
.map(new Func1() {
@Override
public Bitmap call(File file) {
return getBitmapFromFile(file);
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1() {
@Override
public void call(Bitmap bitmap) {
imageCollectorView.addImage(bitmap);
}
});

显然,哪个用的爽,只有自己才知道~

初步使用

添加依赖

    //rxjava
    compile 'io.reactivex:rxjava:1.1.0'
    compile 'io.reactivex:rxandroid:1.1.0'

打印机个字符串

public class MainActivity extends Activity {

    private final String TAG = MainActivity.class.getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 创建一个观察者
        Observer observer = new Observer() {

            @Override
            public void onCompleted() {
                // TODO Auto-generated method stub
                Log.i(TAG, "Completed");
            }

            @Override
            public void onError(Throwable arg0) {
                // TODO Auto-generated method stub
                Log.i(TAG, "onError");
            }

            @Override
            public void onNext(String s) {
                // TODO Auto-generated method stub
                Log.i(TAG, s);
            }

        };

        // 使用Observable.create()创建被观察者
        Observable observable1 = Observable
                .create(new Observable.OnSubscribe() {

                    @Override
                    public void call(Subscriber subscriber) {
                        // TODO Auto-generated method stub
                        subscriber.onNext("Hello");
                        subscriber.onNext("Wrold");
                        subscriber.onCompleted();
                    }

                });
        // 订阅
        observable1.subscribe(observer);
    }

}

以上用到的都是rx包里面的,别用错了!!!

运行结果:
这里写图片描述

这就初步使用到了RxJava

说点什么吧

最近在学习一些听了很久,可就只是听到的时候去搜索一番的知识,例如Retrofit/RxJava/mvp等等。

这里只是在学习Rx的时候,我记录的入门的第一步。接下来会继续上详细学习的笔记,和Demo~

请看下回分解~这里写图片描述