RxJava構文の練習

15125 ワード

以前からRxjavaがどんなに不思議なのか、いろいろなコメントがありました.勉強の勾配が高いとか、難しいとか、自分でやってみました.正直に言って、これらの使い方を見たばかりで、すぐに比べられませんでした.私たちの前の方法とは違います.理解するのは違和感がありました.その後、Android開発者のRxJavaに物線を投げることを詳しく理解して、数日よく研究して、すべての例を真剣に理解して自分でたたき出しました.rxjavaの使い勝手も徐々に実感できます.
勉強を始めたばかりの頃、理解を深めるために、このNotRxJava怠け者専用ガイドに従って、真剣に叩いてみると役に立ちますので、お勧めします.
取得方法、オブザーバーモード、基本構文、オペレータ使用、スレッド制御使用
注意:以下の部分の段落部分はAndroid開発者へのRxJavaの詳細を引用しています.失礼な点があれば、すぐに削除します.
一、取得方法
RxJava RxAndroidはプロジェクトに依存を導入すればいいのですが、私がここで使っているのは最新バージョンではありません
compile 'io.reactivex:rxandroid:1.1.0'
compile 'io.reactivex:rxjava:1.1.0'

二、観察者モード
このモードは基本的に聞いたことがありますが、使ったことがあればそのまま省略できます.
まず、設計モードの観察者モードについて説明します.
オブジェクト間に複数の関係がある場合、オブザーバ・モード(Observer Pattern)を使用します.たとえば、オブジェクトが変更されると、オブザーバ・モードが動作モードに属する依存オブジェクトが自動的に通知されます.
Javaで観察者モードを実現するにはjavaが必要である.utilパッケージに提供されているObservableクラスとObserverインタフェースは、javaがクラスの使用を提供しています.
Observableはjavaソースコードを表示できます.以下はObserverインタフェースです.
 public interface Observer {
     void update(Observable observable, Object data);
 }

簡単な例を挙げます.
骨董品が観察され、観察者はpeopleが骨董品の価格変動を観察するために使用された.
 public class Antique extends Observable {
     private float mPrice;//   

     public Antique(float price) {
         this.mPrice = price;
     }

     public float getPrice() {
         return this.mPrice;
     }

     public void setPrice(float price) {
         super.setChanged();
         super.notifyObservers(price);//      
         this.mPrice = price;
     }

     public String toString() {
         return "     :" + this.mPrice;
     }
 }

オブザーバーはObserverインタフェースを実現し、updateメソッドを書き換えるだけでよい
 public class People implements Observer{

     private String name;

     public People(String name) {
         this.name = name;
     }

     @Override
     public void update(Observable observable, Object data) {
         Log.e("","People update() -> update name:"+ this.name + ",price:"+ ((Float)data).floatValue());
     }

 }

しゅかんすうよびだし
  Antique house = new Antique(1222f);
  People p1 = new People("p1");
  People p2 = new People("p2");
  People p3 = new People("p3");
  house.addObserver(p1);
  house.addObserver(p2);
  house.addObserver(p3);
  Log.e("", house+""); //     
  house.setPrice(111f);
  Log.e("", house+""); //     

これにより,価格が変化すると,すべての購読者に通知され,簡単な観察者モードが実現される.
RxJavaでのオブザーバーモード
オブザーバー:Observerオブザーバー:Observable購読:subscribe()
観察者
Observerは観察者であり,処理イベント発生後のロジック,例えばアンティーク例,価格変更後にはupdae情報が必要であるが,Rxjavaではいくつかの処理状況が多く,onCompleted(),onError(),onNext(),具体的な使い方はdmeoを見ればよい.
被観察者
Observableは、イベントがいつトリガーされるか、どのようなイベントがトリガーされるかを決定する観察者である.create()、just(T...)、from(T[])またはfrom(Iterable extends T>)は、Observableを作成し、イベントトリガ規則を定義します.
購読する
ObservableとObserverを作成した後、subscribe()メソッドで結合します.
三、基本文法
1、Hello Worldを印刷する
Observable.create(new Observable.OnSubscribe() {

     @Override
     public void call(Subscriber super String> subscriber) {
         subscriber.onNext("Hello World");
         subscriber.onCompleted();
     }
 }).subscribe(new Observer() {
     @Override
     public void onCompleted() {
         System.out.println("onCompleted:");
     }

     @Override
     public void onError(Throwable e) {
         System.out.println("onError e:"+e);
     }

     @Override
     public void onNext(String s) {
         System.out.println("onNext s:"+s);
     }
 });

//      

 Observable.just("hello World").subscribe(new Action1() {
     @Override
     public void call(String s) {
         System.out.println("call s:"+s);
     }
 });

2、文字列配列namesのすべての文字列を順次印刷する
 String[] names = {"111", "222", "333"};
 Observable.from(names).subscribe(new Action1() {
     @Override
     public void call(String name) {
         System.out.println("test1 name:" + name);
     }
 });
//   
test1 name:111
test1 name:222
test1 name:333

     

 @Test
 public void test4(){
     //1:    
     String [] names ={"111","222","333"};
     Observable observable = Observable.from(names);

     //2:   
     Action1 onNextAction = new Action1() {
         @Override
         public void call(String s) {
             System.out.println("test4 call"+s);
         }
     };

     Action1 onErrorAction = new Action1() {
         @Override
         public void call(Throwable e) {
             System.out.println("test4 call e:"+e);
       }
     };

     Action0 onCompletedAction = new Action0() {
         @Override
         public void call() {
             System.out.println("test4 call onCompletedAction");
         }
     };
     //3:  :          
     observable.subscribe(onNextAction, onErrorAction, onCompletedAction);
 }

3、just入力したパラメータを順次印刷する
 @Test
 public void test2(){
     Observable.just("1","2","3").subscribe(new Observer() {
         @Override
         public void onCompleted() {
             System.out.println("test2 onCompleted");
         }

         @Override
         public void onError(Throwable e) {
             System.out.println("test2 e:"+e);
         }

         @Override
         public void onNext(String s) {
             System.out.println("onNext:"+s);
         }
     });
 }
   //    onNext:1
  //    onNext:2
 //    onNext:3
 //    test2 onCompleted

4、循環出力リスト
 @Test
 public void test5(){
     Observable.from(Data.getCats().get(0).getlist()).subscribe(new Action1() {
         @Override
         public void call(String s) {
             System.out.println("test5 call :"+s);
         }
     });
 }

 //    test5 call :list:0
 //    test5 call :list:1
 //    test5 call :list:2
 //    test5 call :list:3
 //    test5 call :list:4
 //    test5 call :list:5
 //    test5 call :list:6
 //    test5 call :list:7
 //    test5 call :list:8
 //    test5 call :list:9

四、オペレータ
1、Filter:濾過操作、条件を満たしてから通過できる
@Test
public void FilterTest(){
    Observable.just(1,2,3,4,5,6).filter(new Func1() {
        @Override
        public Boolean call(Integer integer) {
            return integer > 3;//  >3       
        }
    }).subscribe(new Observer() {
        @Override
        public void onCompleted() {
            System.out.println("onCompleted");
        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onNext(Integer integer) {
            System.out.println("onNext integer:"+integer);
        }
    });
}
//  onNext integer:4
//  onNext integer:5
//  onNext integer:6
//  onCompleted

2、first、lastは1つ目または最後の1つしか処理しません
@Test
public void FirstLastTest(){
    Observable.just(1,2,3,4,5,6).first()/*.last()*/.subscribe(new Observer() {
        @Override
        public void onCompleted() {
            System.out.println("onCompleted");
        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onNext(Integer integer) {
            System.out.println("onNext integer:"+integer);
        }
    });
}

 //  onNext integer:1
 //  onCompleted

3、take関数制限開始個数
@Test
public void TakeTest(){
    Observable.just(1,2,3,4,5,6).take(3).subscribe(new Observer() {
        @Override
        public void onCompleted() {
            System.out.println("onCompleted");
        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onNext(Integer integer) {
            System.out.println("onNext integer:"+integer);
        }
    });
}
 //  onNext integer:1
  //  onNext integer:2
  //  onNext integer:3
  //  onCompleted

4、takeLast:最後の個数を制限する
@Test
public void TakeLastTest(){
    Observable.just(1,2,3,4,5,6).takeLast(3).subscribe(new Observer() {
        @Override
        public void onCompleted() {
            System.out.println("onCompleted");
        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onNext(Integer integer) {
            System.out.println("onNext integer:"+integer);
        }
    });
}

   //  onNext integer:4
  //  onNext integer:5
  //  onNext integer:6
  //  onCompleted

5、scan:アキュムレータ関数
@Test
public void ScanTest(){
    Observable.just(1,2,3,4,5,6).scan(new Func2() {
        @Override
        public Integer call(Integer integer, Integer integer2) {
            return integer + integer2;
        }
    }).subscribe(new Observer() {
        @Override
        public void onCompleted() {
            System.out.println("ScanTest onCompleted");
        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onNext(Integer integer) {
            System.out.println("ScanTest onNext interger:"+integer);
        }
    });
}

  //  ScanTest onNext interger:1
  //  ScanTest onNext interger:3
  //  ScanTest onNext interger:6
  //  ScanTest onNext interger:10
  //  ScanTest onNext interger:15
  //  ScanTest onNext interger:21
  //  ScanTest onCompleted
  
  //     1,
  //     1 + 2 = 3,  3
  //     3 +3 = 6;   6
  //     4 + 6;   10
  //            

6、map:listのnameを巡回し、mapオペレータを使用してlistの単項を取得する
 @Test
 public void test7(){
     Observable.from(Data.getCats(10)).map(new Func1() {

       @Override
       public String call(Cat cat) {
           return cat.toCat();//  cat name
       }
   }).subscribe(new Observer() {
       @Override
       public void onCompleted() {
           System.out.println("test7 onCompleted:");
       }

       @Override
       public void onError(Throwable e) {
           System.out.println("test7 onCompleted e:"+e);
       }

       @Override
       public void onNext(String s) {
           System.out.println("test7 onNext :"+s);
       }
   });
 }

 //  test7 onNext :0
 //  test7 onNext :1
 //  test7 onNext :2
 //  test7 onNext :3
 //  test7 onNext :4
 //  test7 onNext :5
 //  test7 onNext :6
 //  test7 onNext :7
 //  test7 onNext :8
 //  test7 onNext :9
 //  test7 onCompleted:

7、flatMap:循環List->catの中のlist->listの中のString
 @Test
 public void test8() {
     //  List -> cat   list -> list    String
     Observable
             .from(Data.getCats())
             .flatMap(new Func1>() {
                 @Override
                 public Observable call(Cat cat) {
                     System.out.println("test8 call #########" + cat.toCat());
                     return Observable.from(cat.getlist());
                 }
             })
             .subscribe(new Action1() {
                 @Override
                 public void call(String s) {
                     System.out.println("test8 call :" + s);
                 }
     });
 }
//    log
//  test8 call #########Cat0
//  test8 call :0:list
//  test8 call :1:list
//  test8 call :2:list
//  test8 call :3:list
//  test8 call :4:list
//  test8 call #########Cat1
//  test8 call :0:list
//  test8 call :1:list
//  test8 call :2:list
//  test8 call :3:list
//  test8 call :4:list
//  test8 call #########Cat2
//  test8 call :0:list
//  test8 call :1:list
//  test8 call :2:list
//  test8 call :3:list
//  test8 call :4:list

五、スレッド制御使用
以上のテスト例では,イベントの開始と消費は同じスレッドで実行されており,RxJavaが同期実行(学習使用)であることに等しいが,観察者モード自体はトリガを待って他の購読者に通知されるので,RxJavaがスレッドをどのように使用するかを理解する.
スレッドを指定しない場合、RxJavaは、どのスレッドがsubscribe()を呼び出し、どのスレッドでイベントを生成するかというスレッド不変の原則に従う.どのスレッドでイベントを生産するか、どのスレッドでイベントを消費するか.スレッドを切り替える必要がある場合は、Scheduler(スケジューラ)が必要です.
  • SchedulerのAPI(一)
  • RxJavaでは、Schedulerスケジューラは、スレッドコントローラに相当し、RxJavaは、各コードがどのようなスレッドで実行されるべきかを指定します.RxJavaには、多くの使用シーンに適したいくつかのSchedulerが内蔵されています.
  • Schedulers.immediate():現在のスレッドで直接実行され、スレッドを指定しないことに相当します.これはデフォルトのSchedulerです.
  • Schedulers.新Thread():常に新しいスレッドを有効にし、新しいスレッドで操作を行います.
  • Schedulers.io():I/O操作(ファイルの読み書き、データベースの読み書き、ネットワーク情報のインタラクションなど)に使用されるScheduler.動作モードとnewThread()の差は多くないが,io()の内部実装は数の上限のないスレッドプールを用いて空きスレッドを再利用できるため,newThread()よりもio()の方が効率的であることが多い.計算作業をio()に置かないでください.不要なスレッドの作成を避けることができます.
  • Schedulers.computation():使用するSchedulerを計算します.この計算とは、CPU密集型の計算であり、I/Oなどの操作によって性能が制限されない操作、例えばグラフィックの計算である.このSchedulerが使用する固定スレッドプールは,CPUコア数の大きさである.I/O操作をcomputation()に入れないでください.そうしないと、I/O操作の待ち時間がCPUを浪費します.
  • また、Androidには専用のAndroid Schedulersがあります.mainThread()は、Androidメインスレッドで指定された操作を実行します.このいくつかのSchedulerがあれば、subscribeOn()とobserveOn()の2つの方法でスレッドを制御することができます.*subscribeOn():subscribe()で発生するスレッド、すなわちObservableを指定する.OnSubscribeがアクティブ化されたときのスレッド.または、イベント発生スレッドと呼ばれます.*observeOn():Subscriberが実行するスレッドを指定します.あるいはイベント消費と呼ばれるスレッド.ImageView表示画像:
  •     Observable.just(R.drawable.ic_launcher).map(new Func1() {
    
         @Override
         public Drawable call(Integer integer) {
             return getResources().getDrawable(integer);
         }
         }).subscribeOn(Schedulers.io()) //    subscribe()     IO   
             .observeOn(AndroidSchedulers.mainThread()) //    Subscriber          
         .subscribe(new Observer() {
         @Override
         public void onCompleted() {
    
         }
    
         @Override
         public void onError(Throwable e) {
             Toast.makeText(MainActivity.this, "Error!", Toast.LENGTH_SHORT).show();
         }
    
         @Override
         public void onNext(Drawable drawable) {
             mImageView.setImageDrawable(drawable);
         }
         });
    

    マルチスイッチスレッド
     Observable.just(1, 2, 3, 4)
     .subscribeOn(Schedulers.newThread()) //    subscribe()     IO   
     .observeOn(Schedulers.io()) //    IO    
     .map(new Func1() {
    
         @Override
         public Integer call(Integer integer) {
             return integer+1;
         }
     })
     .observeOn(AndroidSchedulers.mainThread())//    Subscriber          
     .subscribe(new Action1() {
         @Override
         public void call(Integer number) {
             Log.d(TAG, "number:" + number);
         }
     });
    

    六、参考
  • 観察者
  • Android開発者へのRxJava詳細
  • 七、まとめ
    これには、次の点を理解し、理解する必要があります.
  • 観察者モードが
  • をどのように使用するか
  • RxJavaでのオブザーバモード
  • RxJava基本構文
  • RxJavaオペレータ学習
  • RxJavaスレッド制御
  • 練習コードはWFRxJavaDemoにアップロードされました.ご指摘ください.