RxJava 從入門到愛上它 - 認識

<a href="http://www.itdecent.cn/p/f4af4752cd26">RxJava 從入門到愛上它 - 源碼分析線程控制</a>
<a href="http://www.itdecent.cn/p/ffb6c25f472b">RxJava 從入門到愛上它 - "變換"的深入理解</a>
關于Backpressure 作者也將在后續(xù)的文章中做出解析。

RxJava

RxJava 是什么

官方的解釋是: RxJava是 ReactiveX 在JVM上的一個實現(xiàn),ReactiveX使用Observable序列組合異步和基于事件的程序。

Rx 是一個多語言實現(xiàn)

RxJava 支持Java 6或者更新的版本,以及其它的JVM語言如 Groovy, Clojure, JRuby, Kotlin 和 Scala。RxJava 可用于更多的語言環(huán)境,而不僅僅是Java和Scala,而且它致力于尊重每一種JVM語言的習慣。

為什么要使用 RxJava

  • 函數(shù)式風格:對可觀察數(shù)據(jù)流使用無副作用的輸入輸出函數(shù),避免了程序里錯綜復雜的狀態(tài)
  • 簡化代碼:Rx的操作符通通常可以將復雜的難題簡化為很少的幾行代碼
  • 異步錯誤處理:傳統(tǒng)的try/catch沒辦法處理異步計算,Rx提供了合適的錯誤處理機制
  • 輕松使用并發(fā):Rx的Observables和Schedulers讓開發(fā)者可以擺脫底層的線程同步和各種并發(fā)問題

傳統(tǒng)的調用方法 (此例子來自: https://gank.io/post/560e15be2dca930e00da1083#toc_32)

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

此例子就是異步遍歷文件,如果是以png結尾的就轉換成位圖,然后在主線程中顯示。

如果我們換成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是很必要學習并使用的。

RxJava 怎么使用呢?

  1. 簡單的使用

    Observable.just("hello", "my", "name", "is", "nichool")
                  .subscribe(new Action1<String>() {
                      @Override
                      public void call(String s) {
                          LogUtils.LogW(s);
                      }
                  });
    

    通過just來創(chuàng)建一個被觀察者,被觀察者中決定將會做的事情,然后subscribe進行注冊觀察者。

    以下為在觀察者中將會打印的 :

    RxJavaDemo: hello
    RxJavaDemo: my
    RxJavaDemo: name
    RxJavaDemo: is
    RxJavaDemo: nichool
    
  2. 復雜的操作

    Student[] students= new Student[]{
               new Student("nichool", 100),
               new Student("li", 54),
               new Student("wang", 64),
               new Student("wu", 70),
               new Student("liu", 59),
               new Student("liu", 60),
       };
    
       Observable.from(students).filter(new Func1<Student, Boolean>() {
           @Override
           public Boolean call(Student student) {
               return student.score >= 60;
           }
       }).map(new Func1<Student, String>() {
           @Override
           public String call(Student student) {
               return student.mName + " is a qualified student";
           }
       }).subscribe(new Action1<String>() {
           @Override
           public void call(String s) {
               LogUtils.LogW(s);
           }
       });
    

    以上代碼為:在學生中查找及格的學生,并打印合格學生表。

    RxJavaDemo: nichool is a qualified student
    RxJavaDemo: wang is a qualified student
    RxJavaDemo: wu is a qualified student
    RxJavaDemo: liu is a qualified student
    

如果想了解更多的操作符使用 請查看操作方法這篇文章

  1. 在Android上的配置與使用
    compile 'io.reactivex:rxandroid:1.2.1'
    // Because RxAndroid releases are few and far between, it is recommended you also
    // explicitly depend on RxJava's latest version for bug fixes and new features.
    compile 'io.reactivex:rxjava:1.1.6'
    
    在需要使用RxJava的對應模塊下的build.gradle 中添加這幾句 (如需使用其他的版本,請修改版本號)。使用RxAndroid時最好帶著RxJava,官方的解釋是RxAndroid的版本還很少,需要用RxJava來彌補它的不足。

RxAndroid

解釋: rxjava-android 模塊包含RxJava的Android特定的綁定代碼。它給RxJava添加了一些類,用于幫助在Android應用中編寫響應式(reactive)的組件。

  • 它提供了一個可以在給定的Android Handler 上調度 Observable 的調度器 Scheduler,特別是在UI主線程上 (AndroidSchedulers.mainThread()AndroidSchedulers.handlerThread(handler))。
  • 它提供了一些操作符,讓你可以更容易的處理 Fragment 和 Activity 的生命周期方法。
     // MyActivity
     private Subscription subscription;
    
     protected void onCreate(Bundle savedInstanceState) {
         this.subscription = observable.subscribe(this);
     }
    
     ...
    
     protected void onDestroy() {
         this.subscription.unsubscribe();
         super.onDestroy();
     }
    
  • 它提供了很多Android消息和通知組件的包裝類,用于與Rx的調用鏈搭配使用。
  • 針對常見的Android用例和重要的UI,它提供了可復用的、自包含的響應式組件。(即將到來)

Android中使用 RxLifecycle 更好的保證及時的注冊與解除注冊。

.compose(this.<Long>bindToLifecycle())   //這個訂閱關系跟Activity綁定,Observable 和activity生命周期同步

RxLifecycle更多方法請自行百度

↓↓↓↓↓如果覺得可以的話,請點擊下面的喜歡?;蛘叽蛸p哦,我會更加努力的。↓↓↓↓↓

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容