RxJava安裝及簡單示例

1、在Android Studio中添加RxJava2

一、在build.Gradle添加:
compile ‘io.reactivex.rxjava2:rxandroid:2.0.1’
compile ‘io.reactivex.rxjava2:rxjava:2.1.2’
二、點synet,
三、添加完成。
這裏寫圖片描述java

2、簡單使用RxJava2

一、設定一個場景。
有一個快餐店(kuaicandian)。
我(wo)訂了(subscribe)一份快餐,並留下了地址。
等待送餐到家。react

二、寫代碼。android

//建立一個快餐店。Observable(被觀察者)
      Observable<String> kuaicandian=Observable.create(new ObservableOnSubscribe<String>() {
          @Override
          public void subscribe(ObservableEmitter<String> e) throws Exception {
              Thread.sleep(6000);
              e.onNext("快餐(牛肉麪)");//發送數據
              e.onComplete();//關閉發送數據,之後不能再使用e.onNext
          }
      });
//建立一個我(wo)。Observer(觀察者)
      Observer<String> wo=new Observer<String>() {
          @Override
          public void onSubscribe(Disposable d) {
              tv.setText(tv.getText()+"RxJava-開始送快餐"+"\n");
          }

          @Override
          public void onNext(String s) {
              tv.setText(tv.getText()+"RxJava-快餐送達:"+s+"\n");
          }

          @Override
          public void onError(Throwable e) {
              tv.setText(tv.getText()+"RxJava-送快餐出錯"+"\n");
          }

          @Override
          public void onComplete() {
              tv.setText(tv.getText()+"RxJava-本次快餐送達完畢"+"\n");
          }
      };
//把你的地址留給快餐店。subscribe(訂閱)
        observable.subscribe(wo);

三、點擊」按鍵1「,界面凍結(正在作牛肉麪),過一會,運行結果出現
這裏寫圖片描述
由沒有出錯,因此只有三行信息。app

四、解決界面凍結問題,(本文重點)。
界面凍結是由於在主線程使用了 Thread.sleep(6000),在解決問題只需將這一塊放到另外一個線程中便可。在rxjava中很是簡單,在代碼中添加紅色部分:ide

//把你的地址留給快餐店。subscribe(訂閱)
kuaicandian.subscribeOn(Schedulers.newThread()).subscribe(wo);ui

subscribeOn是把快餐店轉到另外一個線程,Schedulers.newThread()是新建子一個線程放置快餐店。
運行代碼,此次點」按鍵1」後,界面沒有再被凍結,點其餘「按鍵」,文本框中的內容也會改變,可是6秒鐘後,快餐店信息有時能夠送到有時送不到,什麼緣由呢?spa

subscribeOn把快餐店轉到了另外一個線程,快餐店送餐時就要跨線程到把快餐信息送到主線程來,但跨了線程是不可傳數據 的,因此要把快餐店再轉爲主線程。線程

//把你的地址留給快餐店。subscribe(訂閱)
kuaicandian.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread()).subscribe(wo);3d

observeOn是把子線程轉到主線程,AndroidSchedulers.mainThread()是 android的main這個主線程。
再次運行代碼,和上圖同樣,但這一次其餘按鍵均可以點擊。
這裏寫圖片描述code

五、所有代碼以下:
界面代碼:

<?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.ls30_rxjava2_1.MainActivity">


         <TextView  android:id="@+id/tv" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="TextView" />

     <LinearLayout  android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="bottom" android:orientation="horizontal">

         <Button  android:id="@+id/bt1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="按鍵1" android:onClick="bt1_onClick" />

         <Button  android:id="@+id/bt2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="按鍵2" android:onClick="bt2_onClick"/>

         <Button  android:id="@+id/bt3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="按鍵3" android:onClick="bt3_onClick"/>

         <Button  android:id="@+id/bt4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="按鍵4" android:onClick="bt4_onClick"/>
     </LinearLayout>
     </RelativeLayout>java代碼
public class MainActivity extends AppCompatActivity {

  TextView tv;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      tv=(TextView) findViewById(R.id.tv);
  }

  public void bt1_onClick(View view) {
      tv.setText("");
      //建立一個快餐店。Observable(被觀察者)
      Observable<String> kuaicandian=Observable.create(new ObservableOnSubscribe<String>() {
          @Override
          public void subscribe(ObservableEmitter<String> e) throws Exception {
              Thread.sleep(6000);
              e.onNext("快餐(牛肉麪)");
              e.onComplete();
          }
      });

      Observer<String> wo=new Observer<String>() {
          @Override
          public void onSubscribe(Disposable d) {
              tv.setText(tv.getText()+"RxJava-開始送快餐"+"\n");
          }

          @Override
          public void onNext(String s) {
              tv.setText(tv.getText()+"RxJava-快餐送達:"+s+"\n");
          }

          @Override
          public void onError(Throwable e) {
              tv.setText(tv.getText()+"RxJava-送快餐出錯"+"\n");
          }

          @Override
          public void onComplete() {
              tv.setText(tv.getText()+"RxJava-本次快餐送達完畢"+"\n");
          }
      };
      //把你的地址留給快餐店。subscribe(訂閱)
      kuaicandian.subscribeOn(Schedulers.newThread())
                 .observeOn(AndroidSchedulers.mainThread())
                 .subscribe(wo);

  }
  public void bt3_onClick(View view) {
      tv.setText("點了按鍵3");
  }
    public void bt2_onClick(View view) {
      tv.setText("點了按鍵2");
  }
  public void bt4_onClick(View view) {
      tv.setText("點了按鍵4");
  }
}
相關文章
相關標籤/搜索