Android MVP

本文通过一个简单的Android登录应用案例,详细介绍了如何使用MVP(模型-视图-主持人)模式进行架构设计。从Activity、Presenter到Model各部分职责明确,展示了MVP模式在实际项目中的应用。

Google为Android开发者写了几个Demo,帮助开发者设计和制作App,地址如下:
https://github.com/googlesamples/android-architecture
这些框架有使用MVP的,也有使用MVVM的,同时还搭配了一些常用的库,很适合学习。

MVP是模型(Model)、视图(View)、主持人(Presenter)的缩写,分别代表项目中3个不同的模块。

View 对应于Activity、Fragment,负责界面的绘制以及与用户交互。
Model 依然是业务逻辑和实体模型。
Presenter 负责完成View于Model间的交互。
在这里插入图片描述

我们先做一个简单的App,使用MVP实现登陆功能。
文件目录如下所示:
在这里插入图片描述
BasePresenter.java

public interface BasePresenter {

    /**
     * 页面初始化的时候做的事情,根据业务决定是否需要
     */
    void start();
}

BaseView.java

public interface BaseView<T> {

    /**
     * 使用fragment作为view时,将activity中的presenter传递给fragment
     */
    void setPresenter(T t);
}

LoginActivity.java

public class LoginActivity extends AppCompatActivity implements LoginContract.View {

    private EditText edtAccount, edtPassword;
    private Button btnLogin;
    private LoginContract.Presenter mPresenter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        initViews();
        initParams();
    }

    private void initViews() {
        edtAccount = findViewById(R.id.edt_account);
        edtPassword = findViewById(R.id.edt_password);
        btnLogin = findViewById(R.id.btn_login);

        btnLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mPresenter.login();
            }
        });
    }

    private void initParams() {
        mPresenter = new LoginPresenter(this);
    }

    @Override
    protected void onResume() {
        super.onResume();
        mPresenter.start();
    }

    @Override
    public void loginSuccess() {
        Toast.makeText(LoginActivity.this, "登陆成功", Toast.LENGTH_SHORT).show();
        startActivity(new Intent(LoginActivity.this, MainActivity.class));
    }

    @Override
    public void loginError(String msg) {
        Toast.makeText(LoginActivity.this, msg, Toast.LENGTH_SHORT).show();
    }

    @Override
    public String getAccount() {
        return edtAccount.getText().toString();
    }

    @Override
    public String getPassword() {
        return edtPassword.getText().toString();
    }

    @Override
    public void setPresenter(LoginContract.Presenter presenter) {

    }
}

LoginContract.java

public class LoginContract {

    interface View extends BaseView<Presenter> {

        void loginSuccess();

        void loginError(String msg);

        String getAccount();

        String getPassword();
    }

    interface Presenter extends BasePresenter {
        boolean login();
    }
}

LoginHttp.java

public class LoginHttp {

    private LoginHttp() {

    }

    public static LoginHttp getInstance() {
        return Instance.LOGIN_HTTP;
    }

    private static class Instance {
        private static final LoginHttp LOGIN_HTTP = new LoginHttp();

    }

    public boolean login(String account, String password) {
        if (account.equals("aaa")&& password.equals("aaa")) {
            return true;
        }
        return false;
    }
}

LoginPresenter

public class LoginPresenter implements LoginContract.Presenter {

    public LoginContract.View mView;

    public LoginPresenter(LoginContract.View view) {
        mView = view;
    }

    @Override
    public boolean login() {
        if (TextUtils.isEmpty(mView.getAccount())) {
            mView.loginError("账户为空");
            return false;
        }
        if (TextUtils.isEmpty(mView.getPassword())) {
            mView.loginError("密码为空");
            return false;
        }

        boolean result = LoginHttp.getInstance().login(mView.getAccount(), mView.getPassword());
        if (result) {
            mView.loginSuccess();
            return true;
        }
        mView.loginError("账号或密码错误");
        return false;
    }

    @Override
    public void start() {

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值