我对Rxjava的理解

1遇到问题:

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

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

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

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

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

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

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

2,问题思考:

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

new Thread(new Runnable() {
    @Override
    public void run() {
        //获取用户列表
        List<User> users = getUserList();
        mHander.post(new Runnable() {
            @Override
            public void run() {
                //更新ui
                showUserList();
            }
        });

        //获取每个用户详情
        List<UserDetail> 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<Bitmap> 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<Object>() {
    @Override
    public void subscribe(ObservableEmitter<Object> emitter) throws Exception {
        //获取用户列表
        List<User> users = getUserList();
        emitter.onNext(users);

        //获取每个用户详情
        List<UserDetail> 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<Bitmap> 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<Object>() {
            @Override
            public void accept(Object object) throws Exception {
                //Ui更新
            }
        });

 

 

 

 

 

 

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值