RxJava 初探

作者: 花前月下的细说 | 来源:发表于2016-11-18 13:32 被阅读53次

    入门教程推荐

    **RxJava、Retrofit **
    http://www.jianshu.com/p/19cac3c5b106 http://gank.io/post/560e15be2dca930e00da1083 https://gank.io/post/56e80c2c677659311bed9841

    **RxJava 操作符 **
    http://blog.csdn.net/job_hesc/article/details/46242117
    https://www.apkdv.com/rxjava-operator-classification/

    **ReactiveX中文翻译文档(这个特别推荐) **
    https://mcxiaoke.gitbooks.io/rxdocs/content/index.html

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

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

    初步使用

    添加依赖

     //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<String> observer = new Observer<String>() {
    
                @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<String>() {
    
                        @Override
                        public void call(Subscriber<? super String> subscriber) {
                            // TODO Auto-generated method stub
                            subscriber.onNext("Hello");
                            subscriber.onNext("Wrold");
                            subscriber.onCompleted();
                        }
    
                    });
            // 订阅
            observable1.subscribe(observer);
        }
    
    }
    

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

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

    这就初步使用到了RxJava

    说点什么吧

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

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

    相关文章

      网友评论

        本文标题:RxJava 初探

        本文链接:https://www.haomeiwen.com/subject/bnojpttx.html