Android MVP模式学习

Android MVP模式学习

参考:

Android MVP 开发模式有哪些优缺点?https://www.zhihu.com/question/35185744
MVP 模式简单易懂的介绍方式http://kaedea.com/2015/10/11/android-mvp-pattern/
浅谈 MVP in Androidhttp://blog.csdn.net/lmj623565791/article/details/46596109


Android 开发中的 MVP 模式出现已经很久了,网上的资料也有很多,看了很多,不过感觉自己并没有深入理解 MVP 模式的精髓。

刚开始在工程中使用 MVP 模式进行开发时,很不适应,经过一段时候的实践,现在慢慢知道了如何进行开发。

MVP 模式的使用其实很简单,其背后却包含了深刻的思想,记录下这篇文章,在实践中方便查找


主要内容:

  1. MVP 模式原理
  2. 结合 MVP 模式实现用户登录
  3. 结合 MVP 模式实现 ViewPager + TabLayout + Fragment + RecyclerView
  4. 工程代码及其他

MVP 模式原理

百度百科:MVP

维基百科:Model–view–presenter

MVP 全称:Model - View - Presenter

Model 表示数据层,View 表示视图层,Presenter 表示逻辑处理层

MVP 模式中

  • View 不和 Model 进行直接交互,View 通过 Presenter 将前端数据传给 Model,或者通过 PresenterModel 中获取数据,ViewModel 所有的交互都发生在 Presenter
  • View 负责前端的展示以及与用户的交互
  • Model 负责数据的存储以及调用

好处:能够有效解耦工程,分为各个独立模块,功能清晰,有利于重复使用,在调试过程中也能够快速定位错误

缺陷:增加代码工作量


结合 MVP 模式实现用户登录

登录界面如下:

这里写图片描述

新建一个登录对象 Login,用于保存用户名和密码

对数据有两个方面的处理:1 - 清除数据;2 - 验证登录,将其放置在 Presenter 中完成

对视图有两个方面的处理:1 - 清空编辑框;2 - 登录成功,则跳转,否则,提示登录错误

Note:下面仅给出关键代码,完整工程链接在文章末尾

用一个类 MainContract 包含接口:

public class MainContract {

    public interface View extends BaseView<Presenter> {
        void clearEdit();

        void login(boolean isLogin, String username, String pwd);
    }

    public interface Presenter extends BasePresenter {
        void doClear();

        void doLogin(String username, String pwd);
    }
}

Presenter 中实现 ModelView 的交互:

public class MainPresenter implements MainContract.Presenter {

    MainContract.View vMain;

    public MainPresenter(MainContract.View view) {
        vMain = view;
        vMain.setPresenter(this);
    }

    @Override
    public void doClear() {
        vMain.clearEdit();
    }

    @Override
    public void doLogin(String username, String pwd) {
        vMain.onLoading("正在验证...");

        boolean flag = false;

        if (username.equals("zj") && pwd.equals("123456")) {
            flag = true;
        }

        vMain.loadingComplete();

        vMain.login(flag, username, pwd);
    }
}

View 实现前端展示及用户交互:

public class MainActivity extends BaseActivity implements MainContract.View {
    public static final String TAG = MainActivity.class.getSimpleName();

    @BindView(R.id.user)
    EditText user;
    @BindView(R.id.password)
    EditText password;
    @BindView(R.id.clear)
    Button clear;
    @BindView(R.id.login)
    Button login;

    private MainContract.Presenter presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);

        new MainPresenter(this);
    }

    @OnClick({R.id.clear, R.id.login})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.clear:
                presenter.doClear();
                break;
            case R.id.login:
                String username = user.getText().toString();
                String pwd = password.getText().toString();
                presenter.doLogin(username, pwd);
                break;
        }
    }

    @Override
    public void setPresenter(MainContract.Presenter presenter) {
        this.presenter = presenter;
    }

    @Override
    public void onLoading(String text) {
        showLoading(text);
    }

    @Override
    public void loadingComplete() {
        hideLoading();
    }

    @Override
    public void loadingError(String error) {
    }

    @Override
    public void clearEdit() {
        user.setText(null);
        password.setText(null);

        user.requestFocus();
    }

    @Override
    public void login(boolean isLogin, String username, String pwd) {
        Log.e(TAG, "onViewClicked: user = " + username + " pwd = " + pwd);
        if (isLogin) {
            Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show();

            Login lg = new Login(username, pwd);

            Intent intent = new Intent(this, Main2Activity.class);
            intent.putExtra("login", new Gson().toJson(lg));
            startActivity(intent);
        } else {
            Toast.makeText(this, "登录失败", Toast.LENGTH_SHORT).show();
        }
    }
}

结合 MVP 模式实现 ViewPager + TabLayout + Fragment + RecyclerView

Fragment 中实现 MVP 模式和 Activity 类似,用户登录成功(User: zj, pwd: 123456)后,跳转到一个数据展示界面

展示界面如下:

这里写图片描述


工程代码及其他

其实对与 MVP 还是一知半解,不过先记录下来,以后再慢慢补充

完整工程链接:MVPDemo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值