天天看點

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.RxAndroid中map應用

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