目录
学习博客:
在上一篇博客的基础上对model层的逻辑进行了剥离
创建bean
User
package demo.ad.com.mvpdemo.model;
/**
* Created by Firely.Chen Computer on 18/7/28.
*/
public class User {
private String userName;
private String passWord;
public String getUserName() {
return userName;
}
public void setUserName(final String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public User(final String userName, final String passWord) {
this.userName = userName;
this.passWord = passWord;
}
public void setPassWord(final String passWord) {
this.passWord = passWord;
}
@Override
public String toString() {
return "User{" +
"userName='" + userName + '\'' +
", passWord='" + passWord + '\'' +
'}';
}
}
创建Model的接口
interface IUserMode
package demo.ad.com.mvpdemo.model;
/**
* Created by Firely.Chen Computer on 18/7/28.
*/
public interface IUserMode {
/**
* 登录
*
* @param user
* @return 约定返回"true"为登录成功,其他为登录失败的错误信息
*/
boolean login(User user);
}
创建Model的实现类
UserMode
package demo.ad.com.mvpdemo.model;
/**
* Created by Firely.Chen Computer on 18/7/28.
*/
public class UserMode implements IUserMode{
/**
* 登录
*
* @param user
* @return 约定返回"true"为登录成功,其他为登录失败的错误信息
*/
@Override
public boolean login(final User user) {
if (user.getUserName().equals("cjd") && user.getPassWord().equals("123")) {
return true;
}
return false;
}
}
创建View
interface IUserView
package demo.ad.com.mvpdemo.view;
/**
* Created by Firely.Chen Computer on 18/7/28.
*/
public interface IUserView {
/**
* 登录成功
*/
void onLoginSuccess();
/**
* 登录失败
*
*/
void onLoginFailed();
}
创建Persenter
UserPresenter
package demo.ad.com.mvpdemo.presenter;
import android.os.Handler;
import android.os.Message;
import demo.ad.com.mvpdemo.model.IUserMode;
import demo.ad.com.mvpdemo.model.User;
import demo.ad.com.mvpdemo.model.UserMode;
import demo.ad.com.mvpdemo.view.IUserView;
/**
* Created by Firely.Chen Computer on 18/7/28.
*/
public class UserPresenter {
private IUserMode userMode;
private IUserView userView;
public UserPresenter(final IUserView userView) {
this.userView = userView;
userMode = new UserMode();
}
public void login(final User user) {
new Thread() {
@Override
public void run() {
super.run();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
boolean loginResult = userMode.login(user);
if (loginResult) {
userView.onLoginSuccess();
} else {
userView.onLoginFailed();
}
}
}.start();
}
}
MainActivity中调用
package demo.ad.com.mvpdemo.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.mvpdemo.R;
import demo.ad.com.mvpdemo.model.User;
import demo.ad.com.mvpdemo.presenter.UserPresenter;
/**
* MVP的学习
* 传统MVC存在的问题:
* Activity负担过重,Activity即扮演了View的角色又扮演了Controller的角色
* MVP的优势:降低耦合,减轻Activity的负担
* MVP中View和Model间的交互只能通过Presenter()以接口的形式
* https://blog.csdn.net/qq_39085422/article/details/78412977?locationNum=6&fps=1
*/
public class MainActivity extends AppCompatActivity implements View.OnClickListener, IUserView {
private EditText et_username;
private EditText et_password;
private Button bt_login;
private UserPresenter userPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
userPresenter = new UserPresenter(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(final View view) {
String passWord = et_password.getText().toString();
String userName = et_username.getText().toString();
if (!TextUtils.isEmpty(userName) && !TextUtils.isEmpty(passWord)) {
userPresenter.login(new User(userName, passWord));
} else {
Toast.makeText(this, "用户名和密码不能为空", Toast.LENGTH_SHORT).show();
}
}
/**
* 登录成功
*/
@Override
public void onLoginSuccess() {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
}
});
}
/**
* 登录失败
*/
@Override
public void onLoginFailed() {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "登录失败", Toast.LENGTH_SHORT).show();
}
});
}
}
布局文件
<?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>