1、用Rx有什么好处
- 安卓中网络请求要
进行线程切换,有时候一个需求要嵌套请求很多接口。Rxjava都能很方便地解决。
- 从
开始到结束,不必频繁调用handler,很方便。
-流程举例: 开始-》下载图片-》将上一个步骤分配为子线程-》将下一个步骤分配为主线程-》更新UI-》切换为子线程-》根据第一个请求返回的内容请求网络-》将下一个步骤分配为主线程-》请求成功更新UI。
2、上代码
public void rxJavaDownloadImageAction(View view) {
Observable.just(PATH)
.map(new Function<String, Bitmap>() {
@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();
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 {
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) {
progressDialog = new ProgressDialog(DownLoadActivity2.this);
progressDialog.setTitle("download run");
progressDialog.show();
}
@Override
public void onNext(@NonNull Bitmap bitmap) {
image.setImageBitmap(bitmap);
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
if (progressDialog != null)
progressDialog.dismiss();
}
});
}
3、流程流程
- 1、创建操作符 onSubscribe。我要开始干活了
- 2、变换操作符 map 我要处理或者UI了
- 3、功能操作符 subscribeOn切换上步骤线程
- 4、功能操作符 observeOn切换下步骤线程
- 5、变换操作符 apply 我要处理数据或者UI了
- 6、功能操作肤 subscribe 我订阅了我是结尾,最后订阅
4、操作符

5、flatmap和map的区别
5.1 flatmap 可以进行多个请求。
- 比如我请求列表接口,返回了1——10的id。然后可以用flatmap通过id请求接口10次。得到这些id的性情
RxView.clicks(bt_anti_shake)
.throttleFirst(2000, TimeUnit.MILLISECONDS)
.observeOn(Schedulers.io())
.flatMap(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());
}
})
.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传递给下一步的数据是处理过的