Android MVP+Retrofit+dagger2+RxA

作者: hwj3747 | 来源:发表于2017-01-10 17:31 被阅读1352次

    作者:hwj3747
    转载请注明

    目录

    MVC

    说到软件的架构,最基本的就是MVC架构,并且目前为止,大多数Android APP还是采取MVC架构开发的,那么问题来了,MVC真的适合Android吗?
    首先我们要了解一下MVC,MVC的架构图如下:

    MVC (2).png

    MVC架构把app区分成3个部分:
    View:主要是负责显示界面,在Android中用activity来显示界面。
    Model:主要负责数据的存取,例如从服务器取数据,或者做本地的数据缓存。
    Controller:主要负责对整个app用户逻辑的处理。
    整个逻辑很简单,如上图所示:View层接受用户事件,将用户操作发送给Controller层,Controller层再调用Model层请求数据,最后Model层返回数据给View层做显示。

    为什么要有MVP

    我们知道,不管是MVP,MVC,我们的目的只有一个,那就是降低程序的耦合性。但是在Android开发中,传统的MVC模式并不能对程序耦合性有很大的帮助。因为在Activity中setContentView设置页面的XML视图文件充当了View的角色,而Activity中其他业务逻辑的代码充当了Controller的角色,这就使得Activity的负担太大。我们把几乎所有的任务都放在了Activity中,使得程序的可读性变得很差,以及程序日后的维护都变得极其困难。

    MVP

    首先MVP的结构图如下:

    MVP.png

    如上图,MVP架构把程序分成3个部分:
    View:负责显示界面UI。
    Presenter:负责业务处理。
    Model:负责获取数据。
    在MVP中View层已经不能和Model层交互了,而是有了一个Presenter层,同样的View层还是负责显示界面,Presenter层接收View层收到的用户操作,再调用Model层获取数据,根据Model层的返回结果再在这个View上做相应的显示。这样,将View层与Model层完全解耦,Activity不再关心如何获取数据,只需接收Presenter的返回的数据做相应的显示就行了!

    如何实现MVP

    我们来写一个测试程序:
    首先是view层,定义一个View与Presenter交互的接口TestView,定义一个show方法,presenter持有这个接口就可以调用fragment的方法,用来回显数据。在UI界面,我们用一个fragment来显示,这个fragment持有presenter的实例,并且实现TestView方法,在这个界面中一个TextView,一个Button,点击button调用presenter的test方法:

    public interface TestView {    void show(String test);}
    
    public class TestActivityFragment extends Fragment implements TestView {
    
        @Inject
        TestPresenter presenter;
    
        @InjectView(R.id.text)
        TextView text;
    
        @InjectView(R.id.add)
        TextView add;
    
        ...........
        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            presenter.bindView(this);
            add.setOnClickListener(v-> presenter.test());
        }
    
        @Override
        public void show(String test) {
            text.setText(test);
        };
      ...............
    }
    

    然后是presenter层,在presenter层,持有一个Model层的实例,并且有一个test方法,在这个方法中调用Model的test方法获取数据,并且得到返回结果通过调用TestView接口的Show方法回显数据到UI层:

    public class TestPresenter extends BasePresenter<TestView> {
        AbsService mAbsService;
    
        @Inject
        public TestPresenter(AbsService absService) {
            this.mAbsService=absService;
        }
        public void test(){      
               mAbsService.test().subscribe(test->getView().show(test));
        }
    }
    

    最后是Model层,这边用test方法模拟从服务器获取数据返回"test":

    public class AbsService {
    
       ......
        public Observable<String> test(){
            return Observable.create(f->{
                f.onNext("test");
            });
      .......
    }
    

    至此,整个流程完成,即用户点击add按钮,TestActivityFragment 调用presenter的test方法,在presenter调用AbsService 的test方法,presenter得到返回数据并且使用TestView的Show方法回显数据,最终在TestView显示这个数据。

    相关文章

      网友评论

      • 雁归来兮:懒得写Model 把网络请求放在P层😂
        hwj3747:@雁归来兮 你这样的话,每个P层都要写个网络请求,我的做法是把网络请求封装成一个类,既Model层,然后P层再去调用这个类进行网络请求。
        雁归来兮: @雁归来兮 对呀,所以就把请求放在P层处理,省的写Model这么烦人了,伪MVP😂
        hwj3747:那是不是每个P都要写一个Model,这样冗余是不是太多了,不太好吧。。

      本文标题:Android MVP+Retrofit+dagger2+RxA

      本文链接:https://www.haomeiwen.com/subject/gwnkbttx.html