先前有写过基于Rxjava+Retrofit获取网络数据,有时数据源来自本地数据库,读写数据库也是耗时操作。既然mvp+Rxjava的封装适用于网络数据,是否适用于数据库的操作呢? 这几天也查看了相关的资料,没有看到一针见血的文章。细细看来,其实也很简单。只需要改一行代码就可以搞定!
Retrofit的封装过程可以参考先前的文章:安卓框架搭建之MVP+Retrofit+RxJava基础:,这里先给出访问网络数据的关键代码(下面方法在presenter内):
@Override
public void getTestData(int start, int count) {
//获取数据
HashMap map = new HashMap<>();
map.put("start", StringUtils.getString(start));
map.put("count", StringUtils.getString(count));
Observable observable = RetrofitManager.getInstace().create(ApiService.class).getMovieListData(map).map((new HttpResultFunc()));
Subscription rxSubscription = new ProgressSubscriber<>(new SubscriberOnResponseListenter() {
@Override
public void next(MovieListBean testBean) {
mView.setTestBeanData(testBean);
}
@Override
public void error(BaseResultBean errResponse) {
mView.showError(errResponse);
}
}, mContext, false);
RetrofitManager.toSubscribe(observable, (Subscriber) rxSubscription);
addSubscrebe(rxSubscription);
}
①、②、③是RxJava三个主要模块
①Observable 被观察者,即需要在工作线程中执行的任务
②Subscription 观察者,继承自Observer,设置了监听回 调的方法
③订阅的执行和周期管理
在上面的代码中,被观察者是网络数据。而观察者除了返回类型,其他是不需要改变的, 第三点的订阅执行和周期管理也是固定不变的
用RxJava操作数据库,说白了,就是新建一个Observable ,且在Observable 内执行操作数据库的代码。也就是我前面提到的改一行代码就能搞定。下面是插入数据到数据库的代码(在presenter内):
@Override
public void insertUser2Db(UserBean bean) {
//插入数据库,返回是否插入成功
Observable observable = DBManager.getInstace().insertUser(bean);
Subscription rxSubscription = new ProgressSubscriber<>(new SubscriberOnResponseListenter() {
@Override
public void next(Boolean isSuccess) {
mView.doInsertDb(isSuccess);
}
@Override
public void error(BaseResultBean errResponse) {
mView.showError(errResponse);
}
}, mContext);
FileRetrofitManager.toSubscribe(observable, (Subscriber) rxSubscription);
addSubscrebe(rxSubscription);
}
那么下面的重点是Observable 对象与操作数据库如何结合
public Observable insertUser(final UserBean userBean) {
return Observable.create(new Observable.OnSubscribe() {
@Override
public void call(Subscriber super Boolean> subscriber) {
subscriber.onStart();
if (userBean != null) {
ContentValues values = new ContentValues();
values.put("name", userBean.getName());
values.put("number", userBean.getNumber());
//插入数据库失败为-1
if (DBHelper.insertData(DBHelper.USER_TABLE, values) != -1) {
subscriber.onNext(true);
} else {
subscriber.onNext(false);
}
subscriber.onCompleted();
} else {
subscriber.onNext(false);
subscriber.onCompleted();
}
}
});
}
Observable对象的建造很简单,传入相关的参数/类型,重写call()方法,并根据读写完成情况,执行subscriber【观察者】的相关方法。
这样一来,基于目前的框架结构。只需要做小小的改动。就能完美的利用Rxjava操作数据库。不仅仅是数据库。其他类似的耗时操作。也都可以使用这个套路。最近越来越觉得RXjava框架简约而不简单~