關於RxJava,Scheduler 調度器,map事件轉換的過程與原理

  在這裏首先簡單的描述一下本文的具體內容;

1,將RxJava的多種使用方法,通過簡單案例的形式展示給大家,並且帶有備註,

2,之後,在RxJava基本使用方法的基礎上,增添以下Scheduler 調度器的使用,來進行線程等的切換,

3,如何將RxJava內部的一些事件進行轉換,如何單個轉換,如何整個轉換;

可能過程案例比較多,各取所需吧》》》》


1,(a)第一種寫法(分步的,如果有喜歡連用的可連用):


/**
 * 演示RxJava的介紹以及基本使用
 *
 * 1.RxJava是什麼?
 *    RxJava本質就是一個實現異步操作的庫  異步
 *
 * 2.RxJava優點  簡潔(隨着程序的邏輯變得複雜 可以將複雜的邏輯代碼串成一條線)
 *
 * 3.原理 RxJava異步實現 拓展的觀察者模式
 *
 *  觀察者模式:A對象(觀察者)對B(被觀察者)對象的某種變化比較敏感  需要在B對象變化的瞬間
 *  作出反應 程序中的觀察者模式 採用註冊或者訂閱方式 告訴被觀察者當他變化是通知觀察者
 *
 *  android應用中的觀察者案例 view視圖綁定單擊事件
 *  view被觀察者---onClickListener單擊事件的監聽器 觀察者
 *    註冊/訂閱 setOnClickListener()
 *  當單擊view視圖時 通知onClickListener單擊事件的監聽器觀察者對象作出響應(回調onClick方法)
 *
 * RxJava中觀察者模式
 * RxJava中四個基本概念 Observable(被觀察者) Observer(觀察者)
 *  Subscribe(訂閱/註冊)
 *  Observable(被觀察者) Observer(觀察者)通過Subscriber()方法實現訂閱關係
 *  Observable需要時發出事件通知Observer
 *
 */
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //1.創建Observer觀察者對象 他主要決定事件觸發時有怎麼樣的行爲
        Observer<String> observer=new Observer<String>() {
            /**
             * 事件隊列操作完畢時回調的寒肅
             * rxjava中事件處理時不僅可以單獨處理還可以看作事件隊列
             *
             * 作爲事件結束的標誌
             */
            @Override
            public void onCompleted() {
                Log.i("tag","------onCompleted------");
            }

            /**
             * 事件處理過程中出現異常的時候回調
             * onError()被觸發 整個的事件的處理中止
             * 注意:onCompleted()和onError()互斥  正常的事件處理過程中只會調用其中一個函數
             */
            @Override
            public void onError(Throwable e) {
                e.printStackTrace();
            }

            /**
             * 類似與view中 OnClickListener中的onClick方法
             *  主要對被觀察者觸發的事件處理的方法
             */
            @Override
            public void onNext(String s) {
                Log.i("tag","-------onNext-----"+s);
            }
        };

        //2.創建被觀察者對象 他決定什麼時候觸發事件以及觸發怎麼樣的事件
        /*
        Observable.create() RxJava中創建事件序列的方法
        create()方法中需要傳入OnSubscribe對象 OnSubscribe存儲到Observable對象中(計劃表)
        當Observable被訂閱時 OnSubscribe接口中的call()會被回調 事件的序列纔會依次執行觸發
         */
        Observable observable=Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext("Hello");
                subscriber.onNext("hi");
                subscriber.onNext("how are you");
                subscriber.onCompleted();
            }
        });

        //3. 訂閱 註冊  view.setOnClicklistener(onClickListener)
        observable.subscribe(observer);
    }
}

1(b)(第二種寫法)

/**
 * 演示RxJava中的變換寫法
 */
public class MainActivity02 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        /**
         * RxJava中有一個具體實現Observer抽象類的類 Subscriber
         * Subscriber是Observer觀察者類的具體子類 對Observer觀察者進行了拓展
         * 如果只是使用基本功能 Subscriber、Observer基本一樣
         * 區別:
         * 1.Subscriber類中增加了onStart()方法
         * 2.unSubscribe()取消訂閱 當該方法被調用後 Subscriber將不再接收事件
         */
        Subscriber<String> subscriber=new Subscriber<String>() {
            @Override
            public void onCompleted() {
                Log.i("tag","------onCompleted------");
            }

            @Override
            public void onError(Throwable e) {
                 e.printStackTrace();
            }

            @Override
            public void onNext(String s) {
                Log.i("tag","-------onNext-----"+s);
            }

            /**
             * Subscriber中添加的方法  表示在事件發送之前被調用 準備工作  數據清零重置操作
             */
            @Override
            public void onStart() {
                super.onStart();
            }
        };



        //2.創建被觀察者對象 他決定什麼時候觸發事件以及觸發怎麼樣的事件
//        Observable observable=Observable.create(new Observable.OnSubscribe<String>() {
//            @Override
//            public void call(Subscriber<? super String> subscriber) {
//                subscriber.onNext("Hello");
//                subscriber.onNext("hi");
//                subscriber.onNext("how are you");
//                subscriber.onCompleted();
//            }
//        });

        //just() 將傳入的參數作爲onNext()方法的參數進行使用
//        Observable observable=Observable.just("Hello","Hi","how are you");


        String[] array={"Hello","Hi","how are you"};
        Observable observable=Observable.from(array);


        //3. 訂閱 註冊  view.setOnClicklistener(onClickListener)
//        observable.subscribe(observer);
        observable.subscribe(subscriber);
    }
}

1(c)第三種寫法,使用的action的封裝方法:這裏的call其實就是,next(),complete()等的拆分,都
被叫做call,大家不要混亂
<pre name="code" class="java">/**
 * 演示RXJava中Action1 Action0對Observer封裝的寫法
 */
public class ActionActivity extends AppCompatActivity{
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /**
         * Action0是RxJava中的接口 具有一個方法call()  該方法無參數 無返回值
         * Observer觀察者類中onCompleted()也是無參數無返回值  Action0當作
         * 一個包裝對象  將onCompleted()的內容打包作爲參數進行提供給subscribe()
         * 進行使用  不完整定義的回調
         */
        Action0 completed=new Action0() {
            @Override
            public void call() {
                Log.i("tag","--------onComplted----");
            }
        };

        /**
         *  Action1 也是一個接口 具有一個call(T t) 該方法具有一個參數無返回值
         *  對onNext()方法的封裝作爲不完整定義的回調
         */
        Action1<String> nextAction=new Action1<String>() {
            @Override
            public void call(String s) {
                Log.i("tag","-------onNext----"+s);
            }
        };

        Action1<Throwable> errorAction=new Action1<Throwable>() {
            @Override
            public void call(Throwable throwable) {
                throwable.printStackTrace();
            }
        };


        Observable observable=Observable.just("Hello","Hi");
        observable.subscribe(nextAction,errorAction,completed);
    }
}
/*
 Observer<String> observer=new Observer<String>() {
            @Override
            public void onCompleted() {}

            @Override
            public void onError(Throwable e) {}

            @Override
            public void onNext(String s) {}
        }
 */

三種寫法都寫了,下面我通過整體的寫法展示給大家,然後將其中加上一些調度和事件轉換的使用

<pre name="code" class="java">/**
 * RxJava出現就是爲了實現異步操作 後臺處理[工作線程處理耗時操作] 前臺調用[UI線程調用顯示]
 * Scheduler 調度器  線程的控制器   RxJava中通過該對象指定每一段代碼運行在哪個線程中
 *  RxJava中內置的調度器
 *  Schedulers.immediate()  默認scheduler 直接在當前線程中執行
 *  Schedulers.newThread() 表示啓動新的線程 並且代碼在新線程中執行操作
 *  Schedulers.io() io操作線程(讀寫文件 讀寫數據庫 網絡信息交互等)
 *    io()與newThread()行爲模式類似  區別:io()內部無數量上限的線程池
 *    比newThread()更高效
 *  Schedulers.computation() 複雜的計算使用調度器
 *
 * RxAndroid中專門的AndroidSchedulers.mainThread()將操作放到android的主線程/ui線程中執行
 */
public class SchedulerActivity extends AppCompatActivity{
    private ImageView iv;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv= (ImageView) findViewById(R.id.iv_show);
        Observable.create(new Observable.OnSubscribe<Drawable>() {
            @Override
            public void call(Subscriber<? super Drawable> subscriber) {
                Drawable drawable=getResources().getDrawable(R.mipmap.cat);
                subscriber.onNext(drawable);
                subscriber.onCompleted();
            }
        })      /**
         subscribeOn()指定事件發生的線程 就是Observable.OnSubscribe被調用時所處的線程
         表示Observable被觀察者對象中的call方法執行的線程
                */
                .subscribeOn(Schedulers.io())
                /**
                 * observeOn() 表示Observer觀察者運行的線程 事件的消費線程
                 */
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<Drawable>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(Drawable drawable) {
                iv.setImageDrawable(drawable);
            }
        });
    }
}

事件轉換:案例一:

<pre name="code" class="java">/**
 * 演示 RxJava中對事件的轉換
 * 事件轉換:將事件序列中對象或者是整個事件序列進行加工處理 轉換成不同的事件序列
 */
public class MapActivity extends AppCompatActivity {
    private ImageView imageView;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView = (ImageView) findViewById(R.id.iv_show);
        //圖片的路徑(字符串)--bitmap圖片的對象進行展示
        final String filePath = Environment.getExternalStorageDirectory().getAbsolutePath() +
                File.separator + "dog.jpg";
        Observable.just(filePath)

                /**
                 * map()對事件轉換的方法  參數Func1
                 * Func1也是RxJava中的接口 與Action1類似 用於包裝具有一個參數的函數
                 *
                 * Func1和Action1的區別
                 * Func1 包裝具有返回值的方法
                 * Action1 包裝無返回值的方法
                 *
                 * Func1<需要轉換的事件的類型,轉換後的結果類型>
                 *   Func1底層對create()方法的封裝 將String字符串轉換成bitmap封裝到
                 *   Observable被觀察者對象中
                 */
                .map(new Func1<String, Bitmap>() {
                    @Override
                    public Bitmap call(String s) {
                        return BitmapFactory.decodeFile(s);
                    }
                })
                .subscribe(new Action1<Bitmap>() {
                    @Override
                    public void call(Bitmap bitmap) {
                        imageView.setImageBitmap(bitmap);
                    }
                });
    }
}

案例二:

<pre name="code" class="java">/**
 * 演示RxJava中對整個事件序列的轉換
 */
public class FlatMapActivity extends AppCompatActivity{
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


       //2.需求:Student類中加入需要學習的課程名稱 區別:每個學生只有一個名字 但是可以學習多門課程
        List<Course> list01=new ArrayList<>();
        list01.add(new Course(1,"語文"));
        list01.add(new Course(2,"數學"));
        final Student stu01=new Student(1,"張三",list01);
        List<Course> list02=new ArrayList<>();
        list02.add(new Course(1,"Android"));
        list02.add(new Course(2,"Java"));
        Student stu02=new Student(2,"李斯",list02);
        Student[] stus={stu01,stu02};

        /**
         * flatMap()和map()共同點 都是對傳入的參數轉換返回另一個對象
         * 不同點:flatMap()轉換後返回是Observable對象
         */
        Observable.from(stus)
                .flatMap(new Func1<Student, Observable<Course>>() {

                    @Override
                    public Observable<Course> call(Student student) {
                        return Observable.from(student.getCourses());
                    }
                })
                .subscribe(new Observer<Course>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(Course course) {
                        Log.i("tag","----course-----"+course.getCourseName());
                    }
                });
    }
}







發佈了39 篇原創文章 · 獲贊 14 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章