前段時間學習了 Google Samples MVP android-architecture todo-mvp/ 瞭解了 MVP 基本使用方法,以及 UseCase 的使用,之後也用在項目當中,確實帶來了一些好處,比如:數據和 UI 拆分,UseCase 執行重用,使用線程池等等,之後瞭解了 RxJava,有必要合併 mvp 使用下,參考官方 Google Samples github todo-mvp-rxjava/ 例子學習並記錄在此。
同步發佈在簡書Google Samples MVP + RxJava 官方精簡Demo
一、MVP
這部分是最最初的知識,在我的另一篇 Google MVP 你也可以運用自如 總結中可以看到對官方MVP demo todo-mvp/ 的精簡代碼,沒有了解過的可以先看看這個,然後跟着代碼自己操練一下就可以了。
二、RxJava
RxJava 的基本用法肯定是要學的,我這裏就不介紹了,之後會寫一篇關於 RxJava 語法的練習,現在就當你已經會使用 RxJava 了。
RxJava語法練習看這裏,後補充。
三、MVP + 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