前段时间学习了 Google Samples MVP android-architecture todo-mvp/ 了解了 MVP 基本使用方法,以及 UseCase 的使用,之后也用在项目当中,确实带来了一些好处,比如:数据和 UI 拆分,UseCase 执行重用,使用线程池等等,之后了解了 RxJava,有必要合并 mvp 使用下,参考官方 Google Samples github todo-mvp-rxjava/ 例子学习并记录在此。
同步发布在简书Google Samples MVP + RxJava 官方精简Demo
这部分是最最初的知识,在我的另一篇 Google MVP 你也可以运用自如 总结中可以看到对官方MVP demo todo-mvp/ 的精简代码,没有了解过的可以先看看这个,然后跟着代码自己操练一下就可以了。
RxJava 的基本用法肯定是要学的,我这里就不介绍了,之后会写一篇关于 RxJava 语法的练习,现在就当你已经会使用 RxJava 了。
RxJava语法练习看这里,后补充。
修改主要集中在 Presenter 中,由于使用 rxjava 订阅的方式,所以接口更改了,去除了 start() 方法,也不再使用 Handler 来回调主线程,也使用 rxAndroid提供的线程调用相关 Api 。
注意:我这里是把获取数据的逻辑写在了 Presenter 中,这是 demo 形式,如果是真是项目肯定是用写在 Task 中的,这里就是做一些大概描述。
1、BasePresenter 更改:
public interface BasePresenter {
void subscribe();
void unsubscribe();
}
2、添加 Observable :
private void startTask() {
mSubscriptions.clear();
Subscription subscription = getObservable().subscribe(getSubscriber());
mSubscriptions.add(subscription);
}
private Observable<List<String>> getObservable() {
return Observable.create(new Observable.OnSubscribe<List<String>>() {
@Override
public void call(Subscriber<? super List<String>> subscriber) {
try {
Thread.sleep(3000);//模拟一个3秒的加载
} catch (InterruptedException e) {
subscriber.onError(e);
}
List<String> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
list.add(i + "--");
}
subscriber.onNext(list);
subscriber.onCompleted();
}
})
.subscribeOn(mSchedulerProvider.io())//指定 subscribe() 发生在新的线程
.observeOn(mSchedulerProvider.ui());// 指定 Subscriber 的回调发生在主线程
}
//处理数据结果以及UI相关操作
private Subscriber<List<String>> getSubscriber() {
return new Subscriber<List<String>>() {
@Override
public void onStart() {
super.onStart();
mView.setLoading(true);//操作UI
}
@Override
public void onCompleted() {
mView.setLoading(false);//操作UI
}
@Override
public void onError(Throwable e) {
mView.setLoading(false);//操作UI
}
@Override
public void onNext(List<String> list) {
mView.show(list);//view接口回调
}
};
}
3、其他:
另外关于 Scheduler 部分,将其中的模式抽象成接口,使用者实现使用即可
public interface BaseSchedulerProvider {
Scheduler computation();
Scheduler io();
Scheduler ui();
Scheduler newThread();
}
4、代码
关于这部分的练习代码,上传到了分支 android-architecture-todo-mvp-rxjava 上,有需要的朋友可以下载运行,demo 形式很简单,使用 mvp+rxjava 显示一个 list 文本。
以下为编写过程中参考的资料
android-architecture
todo-mvp
todo-mvp-rxjava/
android-architecture