RxJava的简单使用

134 阅读2分钟

1、用Rx有什么好处

  • 安卓中网络请求要进行线程切换,有时候一个需求要嵌套请求很多接口。Rxjava都能很方便地解决。
  • 开始到结束,不必频繁调用handler,很方便。 -流程举例: 开始-》下载图片-》将上一个步骤分配为子线程-》将下一个步骤分配为主线程-》更新UI-》切换为子线程-》根据第一个请求返回的内容请求网络-》将下一个步骤分配为主线程-》请求成功更新UI。

2、上代码

public void rxJavaDownloadImageAction(View view) {
     Observable.just(PATH)
           .map(new Function<String, Bitmap>() {
               // TODO 第2步
               @Override
               public Bitmap apply(@NonNull String s) throws Exception {
                   URL url = new URL(PATH);
                   HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                   httpURLConnection.setConnectTimeout(5000);
                   int responseCode = httpURLConnection.getResponseCode(); // 才开始 request
                   if (responseCode == HttpURLConnection.HTTP_OK) {
                       InputStream inputStream = httpURLConnection.getInputStream();
                       Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                       return bitmap;
                   }
                   return null;
               }
           }).map(new Function<Bitmap, Bitmap>() {
        @Override
        public Bitmap apply(@NonNull Bitmap bitmap) throws Exception {
            // TODO 第3步
            Log.d(TAG, "apply: 是这个时候下载了图片啊:" + System.currentTimeMillis());
            return bitmap;
        }
       })
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<Bitmap>() {
        @Override
        public void onSubscribe(@NonNull Disposable d) {
            // 预备 开始 要分发
            // TODO 第一步
            progressDialog = new ProgressDialog(DownLoadActivity2.this);
            progressDialog.setTitle("download run");
            progressDialog.show();

        }

        @Override
        public void onNext(@NonNull Bitmap bitmap) {
            // TODO 第4步
            image.setImageBitmap(bitmap);
        }

        @Override
        public void onError(@NonNull Throwable e) {
        }

        @Override
        public void onComplete() {
            // TODO 最后1步
            if (progressDialog != null)
                progressDialog.dismiss();
        }
    });

}

3、流程流程

  • 1、创建操作符 onSubscribe。我要开始干活了
  • 2、变换操作符 map 我要处理或者UI了
  • 3、功能操作符 subscribeOn切换上步骤线程
  • 4、功能操作符 observeOn切换下步骤线程
  • 5、变换操作符 apply 我要处理数据或者UI了
  • 6、功能操作肤 subscribe 我订阅了我是结尾,最后订阅

4、操作符

image.png

5、flatmap和map的区别

5.1 flatmap 可以进行多个请求。

  • 比如我请求列表接口,返回了1——10的id。然后可以用flatmap通过id请求接口10次。得到这些id的性情
    RxView.clicks(bt_anti_shake)
        .throttleFirst(2000, TimeUnit.MILLISECONDS) // 2秒钟之内 响应你一次

        // 我只给下面 切换 异步
        .observeOn(Schedulers.io())
        .flatMap(new Function<Object, ObservableSource<ProjectBean>>() {
            @Override
            public ObservableSource<ProjectBean> apply(Object o) throws Exception {
                return api.getProject(); // 主数据
            }
        })
        // 第一步不能map 因为  api Observbale<Bean>  TODO 小作业 同学们自己尝试
        /*.map(new Function<Object, ObservableSource<ProjectBean>>() {
            @Override
            public ObservableSource<ProjectBean> apply(Object o) throws Exception {
                return api.getProject(); // 主数据;
            }
        })*/

        .flatMap(new Function<ProjectBean, ObservableSource<ProjectBean.DataBean>>() {
            @Override
            public ObservableSource<ProjectBean.DataBean> apply(ProjectBean projectBean) throws Exception {
                return Observable.fromIterable(projectBean.getData()); // 我自己搞一个发射器 发多次 10
            }
        })
        .flatMap(new Function<ProjectBean.DataBean, ObservableSource<ProjectItem>>() {
            @Override
            public ObservableSource<ProjectItem> apply(ProjectBean.DataBean dataBean) throws Exception {
                return api.getProjectItem(1, dataBean.getId());
            }
        })

        .observeOn(AndroidSchedulers.mainThread()) // 给下面切换 主线程
        .subscribe(new Consumer<ProjectItem>() {
            @Override
            public void accept(ProjectItem projectItem) throws Exception {
                Log.d(TAG, "accept: " + projectItem);
            }
        });

5.2 传给下一步数据不一样

- flatMap(new Function<RegisterResponse, ObservableSource<LoginResponse>>()
- 传个下一步是subscribe(new Observer<LoginResponse>() {
- map(new Function<RegisterResponse, ObservableSource<LoginResponse>>() 
- 传给下一步是subscribe(Observer<ObservableSource<LoginResponse>>()
- flatmap传递给下一步的数据是处理过的