Android MVP+Retrofit+dagger2+RxA
作者:hwj3747
转载请注明
目录
- (1)配置篇
- (2)Lambda表达式
- (3)icepick篇
- (4)butterknife篇
- (5)MVP篇
- (6)Retrofit篇
- (7)Dagger2篇
- (8)RxAndroid/RxJava篇
MVC
说到软件的架构,最基本的就是MVC架构,并且目前为止,大多数Android APP还是采取MVC架构开发的,那么问题来了,MVC真的适合Android吗?
首先我们要了解一下MVC,MVC的架构图如下:
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显示这个数据。