AndroidMVP+Retrofit+dagger2+RxAndroid框架整合(5)----MVP篇

时间:2017-01-11 20:36:13 公众号:体育最前线

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层交互了,而是有了一个PresenAndroidMVP+Retrofit+dagger2+RxAndroid框架整合(5)----MVP篇ter层,同样的View层还是负责AndroidMVP+Retrofit+dagger2+RxAndroid框架整合(5)----MVP篇显示界面,Presenter层接收View层收到的用户操作,再调用Model层获取数据,根据Model层的返回结果再在这个View上做相应的显示。这样,将View层与Model层完全解耦,Activity不再关心如何获取数据,只需接收Presenter的返回的数据做相应的显示就行了!

如何实AndroidMVP+Retrofit+dagger2+RxAndroid框架整合(5)----MVP篇现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显示这个数据。

Angelababy四肢纤细晒巨肚 「少女孕妇」不科学 0109【法国杯战报】Courtet梅开二度,欧塞尔主场加时4-2击败特鲁瓦晋级32强 0106【追梦少年】华盛顿首都人队冬令营营员石尚可:冰球让我有了挑战的勇气,懂得了坚持的意义! Android实现一个简单的文件浏览器 0107【追梦少年】波士顿棕熊队冬令营营员牟原奇:冰球带给我的快乐是别的东西无法比拟的! Android后台杀死系列之三:LowMemoryKiller原理(4.3-6.0) Androiddrawable的那些细节 Android自定义控件之天气视图