Rxjava的一种用途是他可以统一所以回调接口。
现有个数据库请求的回调,类似下边:
@Override
public void getUsers(LoadUsersCallback callback) {
Runnable runnable = new Runnable() {
@Override
public void run() {
final List<User> users = mCoffeeDao.getUsers();
mAppExecutors.mainThread().execute(new Runnable() {
@Override
public void run() {
if (users.isEmpty()){
//没有用户
callback.onDataNotAvailable();
}else {
callback.onUsersLoaded(users);
}
}
});
}
};
mAppExecutors.singleThread().execute(runnable);
}
将这种接口改装成Rx编程模式
@Override
public Flowable<List<User>> getUsers() {
return Flowable.create(new FlowableOnSubscribe<List<User>>() {
@Override
public void subscribe(FlowableEmitter<List<User>> emitter) throws Exception {
// mCoffeeDao.getUsers();
final List<User> users = mCoffeeDao.getUsers();
if (!users.isEmpty()) {
emitter.onNext(users);
}else {
emitter.onError(new Throwable("user库没有数据"));
}
emitter.onComplete();
}
},BackpressureStrategy.BUFFER);
}
然后调用的时候:
mCompositeDisposable.clear();
Disposable disposable = localDataSourceRx.getUsers()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<List<User>>() {
@Override
public void accept(List<User> users) throws Exception {
if (users != null) {
for (User per : users) {
MyLog.i(TAG, per.toString());
}
}
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
MyLog.i(TAG, throwable.getMessage());
}
}, () -> {
MyLog.i(TAG, "完成: ");
});
mCompositeDisposable.add(disposable);