RxJava安装及简单示例

原创
2020/11/24 15:05
阅读数 167

一、在Android Studio中添加RxJava2

1、在build.Gradle添加:
compile ‘io.reactivex.rxjava2:rxandroid:2.0.1’
compile ‘io.reactivex.rxjava2:rxjava:2.1.2’
2、点synet,
3、添加完成。
这里写图片描述

二、简单使用RxJava2

1、设定一个场景。
有一个快餐店(kuaicandian)。
我(wo)订了(subscribe)一份快餐,并留下了地址。
等待送餐到家。

2、写代码。

      //创建一个快餐店。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);

3、点击”按键1“,界面冻结(正在做牛肉面),过一会,运行结果出现
这里写图片描述
由没有出错,所以只有三行信息。

4、解决界面冻结问题,(本文重点)。
界面冻结是因为在主线程使用了 Thread.sleep(6000),在解决问题只需将这一块放到另一个线程中即可。在rxjava中非常简单,在代码中添加红色部分:

//把你的地址留给快餐店。subscribe(订阅)
kuaicandian.subscribeOn(Schedulers.newThread()).subscribe(wo);

subscribeOn是把快餐店转到另一个线程,Schedulers.newThread()是新建子一个线程放置快餐店。
运行代码,这次点”按键1”后,界面没有再被冻结,点其他“按键”,文本框中的内容也会改变,但是6秒钟后,快餐店信息有时可以送到有时送不到,什么原因呢?

subscribeOn把快餐店转到了另一个线程,快餐店送餐时就要跨线程到把快餐信息送到主线程来,但跨了线程是不可传数据 的,所以要把快餐店再转为主线程。

//把你的地址留给快餐店。subscribe(订阅)
kuaicandian.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread()).subscribe(wo);

observeOn是把子线程转到主线程,AndroidSchedulers.mainThread()是 android的main这个主线程。
再次运行代码,和上图一样,但这一次其他按键都可以点击。
这里写图片描述

5、全部代码如下:
界面代码:

<?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");
  }
}
展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部