Android之RxAndroid2、RxJava2的zip应用场景及示例

RxAndroid2、RxJava2的zip操作目的是为了合并两个Observable并最终发射一个单一的Observable结果。
应用场景:比如在Android APP的开发中,涉及到和后台接口交互,网络请求结果往往不是单一的一次成型完成所有操作,以一个用户登录并获取用户头像Bitmap的流程为例。

第一阶段、先登录成功,获得该用户的用户id诸如此类的必要元数据。
第二阶段、根据第一步获得的用户id然后再次发起网络请求获取该id头像的Bitmap数据,然后显示在ImageView里面。

这两阶段,虽然可以在第一阶段请求成功后再次发起第二阶段网络请求,如在Okhttp中的onSuccess里面拿到用户id,发起第二阶段的头像请求。但是代码逻辑嵌套深,不易于理解和维护。
这样的场景就比较契合RxJava2、RxAndroid2的zip的设计。
现在给出一个小例子说明:

package zhangphil.app;import android.os.Bundle;import android.support.annotation.NonNull;import android.support.annotation.Nullable;import android.support.v7.app.AppCompatActivity;import android.util.Log;import java.util.concurrent.Callable;import io.reactivex.Observable;import io.reactivex.android.schedulers.AndroidSchedulers;import io.reactivex.disposables.CompositeDisposable;import io.reactivex.functions.BiFunction;import io.reactivex.observers.DisposableObserver;import io.reactivex.schedulers.Schedulers;public class MainActivity extends AppCompatActivity {    private final String TAG = getClass().getSimpleName();    private CompositeDisposable mCompositeDisposable = new CompositeDisposable();    @Override    public void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        addItems();    }    private void addItems() {        DisposableObserver disposableObserver = new DisposableObserver<DataObject>() {            @Override            public void onNext(@NonNull DataObject object) {                Log.d(TAG, "#####开始#####");                Log.d(TAG + "数据", String.valueOf(object.A));                Log.d(TAG + "数据", String.valueOf(object.B));                Log.d(TAG, "#####结束#####");            }            @Override            public void onComplete() {            }            @Override            public void onError(Throwable e) {                Log.e(TAG, e.toString(), e);            }        };        mCompositeDisposable.add(                Observable.zip(getObservableA(null), getObservableB(null),                        new BiFunction<String, String, DataObject>() {                            @Override                            public DataObject apply(String a, String b)                                    throws Exception {                                DataObject object = new DataObject();                                object.A = a;                                object.B = b;                                return object;                            }                        })                        .subscribeOn(Schedulers.io())                        .observeOn(AndroidSchedulers.mainThread())                        .subscribeWith(disposableObserver));    }    @Override    protected void onDestroy() {        super.onDestroy();        // 如果退出程序,就清除后台任务        mCompositeDisposable.clear();    }    private Observable<String> getObservableA(@NonNull    final TempObject tempObject) {        return Observable.fromCallable(new Callable<String>() {            @Override            public String call() throws Exception {                try {                    Thread.sleep(5000); // 假设此处是耗时操作                } catch (Exception e) {                    e.printStackTrace();                }                return "A";            }        });    }    private Observable<String> getObservableB(@NonNull    final TempObject tempObject) {        return Observable.fromCallable(new Callable<String>() {            @Override            public String call() throws Exception {                try {                    Thread.sleep(5000); // 假设此处是耗时操作                } catch (Exception e) {                    e.printStackTrace();                }                return "B";            }        });    }    private class DataObject {        public String A = null;        public String B = null;    }    /**     * 这是一个废弃无用的数据结构,用以演示如何在请求之间传递参数     */    private class TempObject {        public String temp;    }}



代码运行输出:

05-12 17:36:53.614 30041-30041/zhangphil.app D/MainActivity: #####开始#####05-12 17:36:53.615 30041-30041/zhangphil.app D/MainActivity数据: A05-12 17:36:53.615 30041-30041/zhangphil.app D/MainActivity数据: B05-12 17:36:53.616 30041-30041/zhangphil.app D/MainActivity: #####结束#####

更多相关文章

  1. “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
  2. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  3. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  4. Modbus在Android上的应用之Modbus RTU Master
  5. Android开发自动生成的AndroidManifest.xml中的allowBackup属性
  6. 给Android开发者的10个建议
  7. OkHttp+Stetho+Chrome调试android网络部分
  8. android开发新浪微博客户端 完整攻略
  9. 记录:Android(安卓)SQLite的使用

随机推荐

  1. 理解Android(安卓)Fragmentation问题
  2. Android中Fragment中启动一个Activity,实
  3. android 带参数广播示例
  4. 使用过时的HttpClient
  5. Android(安卓)程序的安装、卸载和更新
  6. 箭头的使用
  7. android利用数字证书对程序签名
  8. 升级到Android(安卓)Studio 3.2.1,报The s
  9. java服务端与ios,android实现简单数据加密
  10. android中设置AlertDialog的大小