我对Rxjava的理解

1遇到问题:

我们在过长的时间里,习惯了以往事情一步步的处理,这里我讲的一步步的处理,指的是一系列的事件分步进行,比如有如下需求,进入activity之后需要立马进行如下操作:

先获取用户列表》》界面显示用户列表

获取每个用户的详细信息》》将列表item设置为可点击

获取每个用户的头像》》列表中的用户头像显示出来

对于用户的头像进行压缩》》输出压缩成功日志到控制台

将压缩后的头像存储》》输出保存成功日志到控制台

很明显,这一系列的事件如果按照以往的子线程调度,然后handler切换更新ui,必定会使代码变得冗长而那一阅读,代码的缩进也将像进入了地狱般,有人会说,以上步骤可以通过服务器返回足够恰当的数据一步完成。其实这里仅仅做一个例子,况且有些情况,服务端人员并不能沟通到的,比如你需要调用第三方服务的接口,他们不会为了让你方便一些就去对他们整个架构大动干戈的;

2,问题思考:

既然传统的方式看起来很麻烦,那么有没有解决方法?如果目前我们不知道有Rxjava这个东西,让我们自己去封装一个处理类似需求的解决方案该怎么办?我会思考将所有的处理都放到一个线程中去,然后在每一步结束的时候通过handler更新ui,类似如下伪代码:

new Thread(new Runnable() {

    @Override

    public void run() {

        //获取用户列表

        List users = getUserList();

        mHander.post(new Runnable() {

            @Override

            public void run() {

                //更新ui

                showUserList();

            }

        });

        //获取每个用户详情

        List userDetails = new ArrayList<>();

        for (int i = 0; i < users.size(); i++) {

            UserDetail userDetail = getUserDetail(users.get(i).getId());

            userDetails.add(userDetail);

            final int finalI = i;

            mHander.post(new Runnable() {

                @Override

                public void run() {

                    //更新ui

                    updateListViewClickable(finalI);

                }

            });

        }

        //获取每个用户的头像

        List bitmaps = new ArrayList<>();

        for (int i = 0; i < userDetails.size(); i++) {

            UserDetail userDetail = userDetails.get(i);

            final Bitmap bitmap = getUserThumb(userDetail);

            final int finalI = i;

            mHander.post(new Runnable() {

                @Override

                public void run() {

                    //更新ui

                    updateUserHeader(finalI, bitmap);

                }

            });

        }

        //压缩图片

        for (int i = 0; i < bitmaps.size(); i++) {

            Bitmap bitmap = bitmaps.get(i);

            final Bitmap cbitmap = compressBitmap(bitmap);

        }

        mHander.post(new Runnable() {

            @Override

            public void run() {

                //更新ui

                ToastUtils.showShort("压缩图片成功");

            }

        });

        //保存图片

        for (int i = 0; i < bitmaps.size(); i++) {

            Bitmap bitmap = bitmaps.get(i);

            saveBitmap(bitmap);

        }

        mHander.post(new Runnable() {

            @Override

            public void run() {

                //更新ui

                ToastUtils.showShort("保存图片成功");

            }

        });

    }

});

这样做似乎还算简洁(其中有许多不合理的地方,比如图片的一些列处理可以一个循环搞定,这里仅仅做一特例,不必深究),也解决了地狱似得回调,但似乎需要优化的地方超级多:

 1,线程的创建与管理,代码执行线程的指定

 2,线程的切换

 3,代码编写麻烦

 4,数据流处理很不完善

3,基于以上问题的解决:

于是官方出品了自带线程管理,线程切换,链式变成,完善数据操作符的Rxjava,如果带着以上问题再去审视Rxjava会好理解的多吧,那么我们如果按照Rxjava的方式实现以上代码是什么样子的呢?伪代码如下:

Observable.create(new ObservableOnSubscribe() {

    @Override

    public void subscribe(ObservableEmitter emitter) throws Exception {

        //获取用户列表

        List users = getUserList();

        emitter.onNext(users);

        //获取每个用户详情

        List userDetails = new ArrayList<>();

        for (int i = 0; i < users.size(); i++) {

            UserDetail userDetail = getUserDetail(users.get(i).getId());

            userDetails.add(userDetail);

            emitter.onNext(i);

        }

        //获取每个用户的头像

        List bitmaps = new ArrayList<>();

        for (int i = 0; i < userDetails.size(); i++) {

            UserDetail userDetail = userDetails.get(i);

            final Bitmap bitmap = getUserThumb(userDetail);

            emitter.onNext(bitmap);

        }

        //压缩图片

        for (int i = 0; i < bitmaps.size(); i++) {

            Bitmap bitmap = bitmaps.get(i);

            final Bitmap cbitmap = compressBitmap(bitmap);

        }

        emitter.onNext("压缩图片成功");

        //保存图片

        for (int i = 0; i < bitmaps.size(); i++) {

            Bitmap bitmap = bitmaps.get(i);

            saveBitmap(bitmap);

        }

        emitter.onNext("保存图片成功");

    }

}).subscribeOn(Schedulers.io())

        .observeOn(AndroidSchedulers.mainThread())

        .subscribe(new Consumer() {

            @Override

            public void accept(Object object) throws Exception {

                //Ui更新

            }

        });

你可能感兴趣的:(我对Rxjava的理解)