Android之 学习MVP最最简单的构建

学习之路 专栏收录该内容
11 篇文章 0 订阅

MVP是从MVC里演变来的,比MVC有更好的耦合性,相通的地方:

Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。

不同的地方:

1.MVC中的V可以直接访问M。MVP中的V不可以直接访问M,需要通过P。

···

不赘述了。

打开你的AS,一起从头开始搭建一个MVP Demo吧(以登录为例)

1.定义View层接口

public interface LoginView {
    void loginSuccess();//登录成功
    void loginFail();//登录失败

}

2.MainActivity实现View接口

public class MainActivity extends AppCompatActivity implements LoginView {

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


    @Override
    public void loginSuccess() {
        //登录成功的操作
    }

    @Override
    public void loginFail() {
        //登录失败的操作
    }
}

3.定义Model接口

public interface LoginModel {
    interface OnLoginListener {
        void onLoginSuccess();

        void onLoginFail();
    }
    void login(String username, String password, OnLoginListener listener);
}

4.Model接口的实现类

public class LoginModelImpl implements LoginModel {
    @Override
    public void login(final String username, final String password, final OnLoginListener listener) {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                if (username.equals("admin") && password.equals("admin")){
                    listener.onLoginSuccess();
                } else {
                    listener.onLoginFail();
                }
            }
        }, 2000);
    }
}

5.定义Present接口(控制Model来执行具体登录操作)

public interface LoginPresent {
    void doLogin(String username, String password);
}

6.Present接口的实现类

public class LoginPresentImpl implements LoginPresent, LoginModel.OnLoginListener {
    private LoginView mView;
    private LoginModel mModel;

    public LoginPresentImpl(LoginView mView, LoginModel mModel) {
        this.mView = mView;
        this.mModel = mModel;
    }

    @Override
    public void doLogin(String username, String password) {
        mModel.login(username, password, this);
    }

    @Override
    public void onLoginSuccess() {
        mView.loginSuccess();
    }

    @Override
    public void onLoginFail() {
        mView.loginFail();
    }
}

7.在MainActivity中控制Present去执行登录

public class MainActivity extends AppCompatActivity implements LoginView {
    private LoginPresentImpl mPresent;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mPresent = new LoginPresentImpl(this, new LoginModelImpl());


        findViewById(R.id.login).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String username = ((EditText) findViewById(R.id.username)).getText().toString().trim();
                String password = ((EditText) findViewById(R.id.password)).getText().toString().trim();
                if (!username.equals("") && !password.equals("")) {
                    //执行登录操作需要通过Present控制Model请求
                    mPresent.doLogin(username, password);
                } else {
                    //用户名或者密码为空
                    //当然,可以根据业务需求,更改判断。这里随便写的
                }
            }
        });
    }

    @Override
    public void loginSuccess() {
        //登录成功的操作
    }

    @Override
    public void loginFail() {
        //登录失败的操作
    }
}

最最简单的MVP Demo 就构建完了。

哦对了...

8.activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.user.mvplogindemo.MainActivity">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <EditText
            android:id="@+id/username"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"

            />
        <EditText
            android:id="@+id/password"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
        <Button
            android:id="@+id/login"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="登录"
            />
    </LinearLayout>


</RelativeLayout>

OK,完成了。

这篇博客应该算比较简单的了。照着做就行

 

  • 1
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值