(新手必看)安卓MVP的理解,看完你就会用mvp了

针对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.csdn.net/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

 

 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值