google-android-mvp例子简析
我今天要分析的是google在github上提供的使用mvp的例子。项目的源代码传送门。
代码的编写工具是Android studio 没有该工具的同学可以点击androidtool或者google develaper(这个需要科学上网)去下载。
好了开始正题,项目clone下来先在模拟器上运行看看实现的效果
![主页面](https://oalmlvop6.qnssl.com/blog/android_mvp_sample/mvp_sample_one.png)
我就从这个主页面上分析如何使用mvp模式进行设计的,其他界面的实现方式类似,源码的的包的组织模式不是我们平常通过功能进行区分的,源码的包的组织形式主要是把不同Activity的实现组成一个包,其中主页面的包结构如下图:
![主页面的包内容](https://oalmlvop6.qnssl.com/blog/android_mvp_sample/mvp_sample_one_classes.png)
其中ScrollChildSwipeRefreshLayout和TaskFilterType与mvp的关系不大,ScrollChildSwipeRefreshLayout这是一个自定义的view,用来完成下拉刷新的功能,TasksFilterType是定义数据的状态的枚举。
google把p和v的接口方法写在了TaskContract这个接口中:
public interface TasksContract {
interface View extends BaseView<Presenter> {...}
interface Presenter extends BasePresenter {...}
在View这个接口除了继承了BaseView这个接口的
void setPresenter(T presenter);
方法外定义了一系列的show方法用于控制界面的展示。
在Presenter这个接口除了继承BasePresenter这个接口的
void start();
方法外还定义了一系列的控制方法。就个人对对于这些接口方法的理解而言,在View这个接口中主要是控制小范围的界面变化,而Presenter这个接口中的方法主要针对用户的操作,比如点击toolbar上的item。
在TestsActivity中除了完成Presenter、toolbar、DrawerLayout等的初始化之外没有任何其他的业务逻辑控制。(嗯,Activity中的代码看起来贼清爽),主要的界面变化放在了Fragment中进行了实现(这也是google推荐的实现方式)。TasksFragment实现了TasksContract.View这个接口的所有方法,并通过setPresenter
方法设置TasksContract.Presenter的实现类,之后就可以愉快的在控件的xxxClickListener方法中调用Presenter中的各种方法了。TasksPresenter是TasksContract.Presenter的实现类,在实例化这个类的时候把TasksContract.View接口的实现类传入。并通过调用View接口的
setPresenter
方法完成Presenter和View之间的绑定,因为TasksContract.View的实现类是作为构造参数传入的,因此,在Presenter的实现方法可以通过调用TasksConContract.View的实现类的各种界面展示方法来完成与用户的交互。很好的做到了界面控制和交互之间的解耦。
恩,这个源码大体就是这样,如果还有不太明白的可以通过查看项目, 结合运行效果进行同步理解。