Google Samples MVP + RxJava 官方精简Demo

邢焕
2023-12-01

前段时间学习了 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

 类似资料: