目录
写在前面
本文是最基本的MVP模式实现,目的只是搞清楚MVP模式的实现方式,实际应用中,还可以做很多改装和优化,下一篇博客会对model层做简单优化.优化的特别好的文章,推荐这一篇Android MVP架构搭建
项目结构
- model层负责业务逻辑和实体模型(bean,model)
- presenter层负责View和Model的交互,纽带作用
- view层负责处理view和用户交互,如activity
代码实现
创建model
这里我我把bean和mode都统一写在bean中了
LoginModel
package demo.ad.com.mvpdemo2.model;
/**
* Created by Firely.Chen Computer on 18/7/28.
*/
public class LoginModel {
private String userName;
private String passWord;
public LoginModel(final String userName, final String passWord) {
this.userName = userName;
this.passWord = passWord;
}
public boolean login() {
if ("cjd".equals(userName) && "123".equals(passWord)) {
return true;
}else {
return false;
}
}
}
创建view
interface LoginView
package demo.ad.com.mvpdemo2.view;
/**
* Created by Firely.Chen Computer on 18/7/29.
*/
public interface LoginView {
void loginSuccess();
void loginFailed();
}
创建presenter
连接view和model
LoginPresenter
package demo.ad.com.mvpdemo2.presenter;
import android.os.Handler;
import android.os.Looper;
import demo.ad.com.mvpdemo2.model.LoginModel;
import demo.ad.com.mvpdemo2.view.LoginView;
/**
* Created by Firely.Chen Computer on 18/7/28.
*/
public class LoginPresenter {
private LoginModel loginModel;
private LoginView loginView;
private Handler handler;
public LoginPresenter(final LoginView loginView) {
this.loginView = loginView;
handler = new Handler(Looper.getMainLooper());
}
public void login(String userName, String pwd) {
loginModel = new LoginModel(userName, pwd);
handler.postDelayed(new Runnable() {
@Override
public void run() {
boolean login = loginModel.login();
if (login) {
loginView.loginSuccess();
} else {
loginView.loginFailed();
}
}
}, 2000);
}
}
Mainactivity调用
MainActivity
package demo.ad.com.mvpdemo2.view;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import demo.ad.com.mvpdemo2.R;
import demo.ad.com.mvpdemo2.presenter.LoginPresenter;
public class MainActivity extends AppCompatActivity implements View.OnClickListener, LoginView {
private EditText et_username;
private EditText et_password;
private Button bt_login;
private LoginPresenter loginPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
loginPresenter = new LoginPresenter(this);
}
private void initView() {
et_username = (EditText) findViewById(R.id.et_username);
et_password = (EditText) findViewById(R.id.et_password);
bt_login = (Button) findViewById(R.id.bt_login);
bt_login.setOnClickListener(this);
}
@Override
public void onClick(View view) {
String passWord = et_password.getText().toString();
String userName = et_username.getText().toString();
if (!TextUtils.isEmpty(userName) && !TextUtils.isEmpty(passWord)) {
Toast.makeText(this, "登录中,请稍等...", Toast.LENGTH_SHORT).show();
loginPresenter.login(userName, passWord);
} else {
Toast.makeText(this, "用户名和密码不能为空", Toast.LENGTH_SHORT).show();
}
}
@Override
public void loginSuccess() {
Toast.makeText(this, "登录成功", Toast.LENGTH_LONG).show();
}
@Override
public void loginFailed() {
Toast.makeText(this, "登录失败", Toast.LENGTH_LONG).show();
}
}
布局文件
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
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="demo.ad.com.mvpdemo.view.MainActivity">
<EditText
android:id="@+id/et_username"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="请输入用户名"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<EditText
android:id="@+id/et_password"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="请输入密码"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/et_username"/>
<Button
android:id="@+id/bt_login"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="12dp"
android:text="登录"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/et_password"/>
</android.support.constraint.ConstraintLayout>