超简单的MVP模式案例

在说mvp之前,先说下mvc:

MVC( Model View Controller):一种将逻辑和视图分隔开来的架构设计,起源于web端。其实 Android应用的开发中本身可视为一种MVC架构。

  • M–>Model: 数据模型(bean文件)、 业务逻辑
  • V–> View:可见的界面(android的xml布局文件)
  • C–>Controller:控制view和model的交互(android的 Activity)

说是这样,其实在实际开发中,大家仔细想想,Activity是不是很尴尬。。。( Activity既要负责视图的显示,又要负责对业务逻辑的处理)

好了重点来了:注意前方高能!!!

用法:

  • Model
    这个东东,我看了好多mvp的案例,好像model层和其他两层分界不是很明显一样,写的可有可无似的,还有案列说这层可以写一些比如访问数据库、访问网络的方法等,好吧,我的案例就是写的请求服务器的。

  • View:这个view就是要把与用户交互的效果展示出来,我们要把这些方法抽取出来,然后让activity或者fragment去实现这些方法(当然有些重复的方法我们最好抽取到基类里面)。

  • Presenter:在这里我们需要获取view和model的引用,从而完成view和model的交互。

看到这里是不是有点懵逼。。。
这里写图片描述

下面看案例:

   为了清晰,我写了最少的代码来讲我理解的mvp:

先上图压压惊:

这里写图片描述

没错,这是项目文件:

BaseView.java:
一共2个方法,注释很清晰,当然我们的view(activity)要实现这个接口

package app.project.mvp.view;

/**
* Created by QLY on 2016/8/31.
*
* UI逻辑接口,一般有activity、Fragment实现
*/
public interface BaseView {
    /**
    * 显示加载进度
    */
    void loading();
    /**
    * 隐藏加载进度
    */
    void cancelLoading();

}

BaseNet.java:
定义一个请求服务器的方法

package app.project.mvp.model;

/**
* Created by QLY on 2016/9/1.
*/
public interface BaseNet {
    /**
    * 请求服务器
    */
    void RequestService();
}

BaseNetIml.java:
实现类

package app.project.mvp.model;

import android.util.Log;

/**
* Created by QLY on 2016/9/1.
*/
public class BaseNetIml implements BaseNet{

    @Override
    public void RequestService() {
        Log.i("test", "RequestService: 请求服务器。。。");
    }
}

BasePresenter .java:

package app.project.mvp.presenter;

/**
* Created by QLY on 2016/9/1.
* 页面业务逻辑(一般都要参与服务器交互)
*/
public interface BasePresenter {

    /**
    * 数据加载结果
    */
    void loadResult();
}

PresenterIml.java

负责拿到BaseView 、BaseNet的引用,从而实现交互

package app.project.mvp.presenter;

import android.util.Log;

import app.project.mvp.model.BaseNet;
import app.project.mvp.model.BaseNetIml;
import app.project.mvp.view.BaseView;

/**
* Created by QLY on 2016/9/1.
*/
public class PresenterIml implements BasePresenter {
    private BaseView mvpView;
    private BaseNet baseNet;

    public PresenterIml(BaseView mvpView) {
        this.mvpView = mvpView;
        baseNet = new BaseNetIml();
    }

    /**
    * 加载数据
    */
    public void loadData() {
        mvpView.loading();
        baseNet.RequestService();
    }

    @Override
    public void loadResult() {
        Log.i("test", "loadResult: 服务器返回结果。。。");
        mvpView.cancelLoading();
    }
}

接下来就是activity了:

package app.project.mvp.view;


import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import java.util.Random;

import app.project.R;
import app.project.mvp.presenter.BasePresenter;
import app.project.mvp.presenter.PresenterIml;

public class TestActivity extends AppCompatActivity implements BaseView {
    private PresenterIml mPresenter;
    boolean flag;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        mPresenter = new PresenterIml(this);
        //开始请求服务器
        mPresenter.loadData();
        //加载完成
        mPresenter.loadResult();
    }

    @Override
    public void loading() {
        Log.i("test", "loading: 开始加载。。。");
    }

    @Override
    public void cancelLoading() {
            Log.i("test", "loading  加载完成。。。");

    }

}

看 log:
这里写图片描述

差点忘了大招没放。。。:

下图是github的一张图,比较靠谱,大家不要看左面,看右面,你们是不是发现activity、fragment里包裹了
view、presenter这就说activity要拿到二者的引用来实现model和view的交互,其实左面就是model层。

这里写图片描述

不要问我bean文件为什么不用,因为我只是像说明mvp的基本用法,bean太low没个卵用。。。

这里写图片描述

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值