针对mvp模式 去架构大概的4个步骤
1:UI实现View方法,
2.presenter调用具体的逻辑实现(比如 请求网络等)
3.逻辑实现 回掉presenter方法
4.presenter回调view。
M层:数据模型,存储数据,比如bean
V层:展示数据
P层:负责MV之间的桥梁,以及相关的逻辑处理
View不直接与Model交互,
我认为,和之前的MVC相比,让M与V实现了彻底的解耦,而把相关逻辑(比如请求网络)放到了P里去处理,这样更佳符合面向对象的思想,比如这件事原本是V做,但是V不想做了,把它交给了P去处理,不管P是怎么实现的,V里只是在回调中等待结果就好。
面向对象的思想:早上想吃油条,自己懒得做,去买了一份,对我们来说,做早点的就是我们所面向的对象,不管油条是怎么做出来的,我们只是能吃到油条就好。
然而,MVP模式,会让V与P形成一个相互依赖的关系,p可能会时刻保存着V的引用,进而引起内存泄漏的问题
解决的方法:通过声明周期和弱引用的方式处理:http://blog.youkuaiyun.com/qq_28051795/article/details/53639726
比如:实现一个单纯的展示数据的功能,用MVP的架构去实现:
具体的实现:
1.创建一个基本的接口Presenter:
public interface Presenter {
//请求网络
void GetNetwork();
}
2.创建一个类实现这个接口,比如MainPresenter
public class MainPresenter implements Presenter {
private List<Data.DataEntity.InfoEntity.CarouselEntity> carousel;
private MainActivity view;
public MainPresenter(MainActivity view) {
this.view=view;
}
//请求网络
@Override
public void GetNetwork() {
NetWorks.verfacationCodeGet("Applist.index", new Observer<Data>() {
@Override
public void onCompleted() {
Log.e("zq","请求成功");
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Data data) {
Log.e("zq","请求也成功");
carousel = data.getData().getInfo().getCarousel();
view.showBanner(carousel);
}
});
}
3.创建一个View的接口,用来和presenter建立关系(比如展示数据,供MainActivity去回调)
public interface Views {
void showData( List<Data.DataEntity.InfoEntity.CarouselEntity> list);
// 展示轮播图
void showBanner( List<Data.DataEntity.InfoEntity.CarouselEntity> list);
}
4.在MainActivity 去实现这个接口 并且回调了这两个方法
public class MainActivity extends AppCompatActivity implements Views {
@Override
public void showData(List<Data.DataEntity.InfoEntity.CarouselEntity> list) {
}
@Override
public void showBanner(List<Data.DataEntity.InfoEntity.CarouselEntity> list) {
rollPagerView.setAdapter(new BannerAdapter(list,MainActivity.this));
Log.e("zq",list.get(1).getImagepath());
}
5.在MainActivity中创建MainPresenter这个对象并且调用里边的请求网络的方法,并且把MainActivity的引用传递过去用来回调展示数据的方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MainPresenter mainPresenter=new MainPresenter(MainActivity.this);
mainPresenter.GetNetwork();
6.在请求成功的时候,展示数据。请求网络用的是Retiofit 所以请求成功后,会在onNext方法中返回结果,通过传递过来的引用,调用showBanner()(这个方法就是Views里自定义的方法)回调给MainAcitivity
public class MainPresenter implements Presenter {
private List<Data.DataEntity.InfoEntity.CarouselEntity> carousel;
private MainActivity view;
public MainPresenter(MainActivity view) {
this.view=view;
}
//请求网络
@Override
public void GetNetwork() {
NetWorks.verfacationCodeGet("Applist.index", new Observer<Data>() {
@Override
public void onCompleted() {
Log.e("zq","请求成功");
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Data data) {
Log.e("zq","请求也成功");
carousel = data.getData().getInfo().getCarousel();
view.showBanner(carousel);
}
});
}
7.然后在MainActivity的showBanner的参数重就会有数据
@Override
public void showBanner(List<Data.DataEntity.InfoEntity.CarouselEntity> list) {
rollPagerView.setAdapter(new BannerAdapter(list,MainActivity.this));
Log.e("zq",list.get(1).getImagepath());
}
github 源码链接:https://github.com/zq019633/MyFirstApp