RxJava RxAndroid 在android中最重要的应用(一)

首先 在这里放上两个库的地址

https://github.com/ReactiveX/RxJava

https://github.com/ReactiveX/RxAndroid

 

android studio 中 我们可以添加依赖

compile 'io.reactivex:rxjava:1.0.14'

compile 'io.reactivex:rxandroid:1.0.1'

 

在我看来 Rxjava 异步,简洁的代名词,

可能自己理解的不够深入,目前,自己只是在自己的项目中简单的应用了他最基本的功能,让他进行开辟线程 异步操作, 其中的map函数式编程 是他的主要应用.

RxJava 由三个部分组成 Observable可观察的对象 ,subscribe订阅者,Scheduler线程控制 .

他的流程上是:创建的Observable对象   ,所有Observer一旦订阅这个Observable就会立即调用onNext()方法并传入Observable.的的参数,而后因为Observable没有数据可以发送了,onComplete()方法会被调用。


Rxjava 的学习曲线之所以陡峭 ,是因为他的方法库太多,而且编程思想不同,例如在Observable

中 map, flatMap ,filter,doOnNext等等,



 

 

接下来  来介绍它的主要应用

 

1.RxAndroid  基本的应用(异步)


  private void asyncSave() {
        saveObservable = Observable.fromCallable(new Callable<String>() {
            @Override
            public String call() throws Exception {//通知调用  并返回string
                return savePic(file, bitmap);//此方法在io线程中调用 并返回
            }
        });

        saveSubscription = saveObservable
                .subscribeOn(Schedulers.io())//observable在调度中的IO线程中进行调度进行
                .observeOn(AndroidSchedulers.mainThread())//在主线程中进行观察
                .subscribe(new Observer<String>() { //订阅观察者
                    @Override
                    public void onCompleted() {
                    }
                    @Override
                    public void onError(Throwable e) {
                    }
                    @Override
                    public void onNext(String s) {//带参数的下一步,在此就是当
                        textView.setText("saveSubscription: save sucessful ,the file name is " + s);

                    }
                });
    }


 

 

 

2.RxAndorid single应用

 

private void singleObservable() {
        Single<String> stringSingle = Single.fromCallable(new Callable<String>() {
            @Override
            public String call() throws Exception {
                return savePic(file, bitmap);
            }
        });
        mSingleSubscriber = stringSingle
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new SingleSubscriber<String>() {
                    @Override
                    public void onSuccess(String value) {
                        textView.setText("mSingleSubscriber: save sucessful ,the file name is " + value);
                    }

                    @Override
                    public void onError(Throwable error) {

                    }
                });

    }

 

3.RxAndroidmap应用

    private void createObservables() {
        mSearchResultsSubject = PublishSubject.create();
        mTextWatchSubscription = mSearchResultsSubject
                .debounce(400, TimeUnit.MILLISECONDS)//去抖动
                .observeOn(Schedulers.io())
                .map(new Func1<String, List<String>>() {//map函数式编程 
                    @Override
                    public List<String> call(String s) {
                        return mRestClient.searchForCity(s);
                    }
                })
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<List<String>>() {//订阅并进行处理
                    @Override
                    public void onCompleted() {
                    }
                    @Override
                    public void onError(Throwable e) {
                    }
                    @Override
                    public void onNext(List<String> cities) {//这里的cities 是一个整体,next
                        handleSearchResults(cities);
                    }
                });
    }

    private void getFile(List<File> folders){//
        Observable.from(folders)//在后台,用来代替for循环,以及其中的逻辑判断
                .flatMap(new Func1<File, Observable<File>>() {
                    @Override
                    public Observable<File> call(File file) {//将list 中的每一个都分别处理 好比foreach
                        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) {//list中的数据 一个个的next
                        ImageView imageView =new ImageView(getBaseContext());
                        imageView.setImageBitmap(bitmap);
                        imageCollectorView.addView(imageView);
                    }
                });
    }


4. 避免内存泄露

当activity结束时,要调用 如下, 避免内存泄露,因为涉及到线程问题时候,都会出现内存问题

 @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mTextWatchSubscription != null && !mTextWatchSubscription.isUnsubscribed()) {
            mTextWatchSubscription.unsubscribe();
        }
    }


Rxandroid 还有一些其他的用法,比如请求网络,rxBus等等,.在请求网络上 用volley ,xutils即可,在事件总线上,用eventBus,所以在此就不再讨论这些的情况

Rxandroid 是一个工具,一般用来替代handle 和asynctasic类这种容易引发内存泄露的方法,还有就是 用来简化代码逻辑结构,

我想仅对于应用层面,上面这些应该够用了,写这篇文章,是为了我们更好的学习, 欢迎大家指正,提问~

关于rxandroid 更深层次的问题,还希望我们一起共同探索,我也会在后期的博文中继续研究其中的原理~~

大家一起努力吧!!!

关于项目的Demo(写了那么多,也不容易,给个赞吧~~~谢谢) :https://github.com/ccj659/myRxAndroid.git


你可能感兴趣的:(android,rxjava,rxandroid,响应式编程,ReactiveX)