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更新
}
});