登录MVP实现

布局实现用户名密码输入框点击登录按钮

<?xml version="1.0" encoding="utf-8"?>











创建一个User类用来描述用户信息

public class User {
public String username;
public String password;
}

再创建一个类根据MVC的设计原则,把模拟的网络请求逻辑拆分到Module层

public class UserLoginNet {
public boolean sendUserLoginInfo(User user){
//模拟耗时操作
SystemClock.sleep(2000);
//对用户输入的信息进行判断
if(“qianjiu”.equals(user.username) && “qianjiu”.equals(user.password)){
//登录成功
return true;
}else{
//登录失败
return false;
}
}
}

根据MVP的设计原则,把Activity里的业务逻辑拆分到Presenter层,使用网络工具也在这里,直接拿数据

public class UserLoginPresenter {

public UserLoginPresenter(UserLoginPresenterInterface userLoginPresenterInterface) {
    mUserLoginPresenterInterface = userLoginPresenterInterface;
}

/**
 * 对用户输入进行非空判断,业务逻辑
 *
 * @param user
 * @return
 */
public boolean submit(User user) {
    if (TextUtils.isEmpty(user.username) || TextUtils.isEmpty(user.password)) {
        return false;
    }
    return true;
}

public void login(final User user) {
    //2.开一个子线程做耗时操作,业务逻辑
    new Thread() {
        public void run() {
            //3.创建网络工具类对象,业务逻辑
            UserLoginNet net = new UserLoginNet();
            //4.对用户输入的信息进行判断,,业务逻辑
            if (net.sendUserLoginInfo(user)) {
                //5.Activity对象调用更新视图的方法
                mUserLoginPresenterInterface.success();
            } else {
                mUserLoginPresenterInterface.failed();
            }
        }
    }.start();
}

/**
 * 定义接口,无论是Activity还是Fragment都可以使用Presenter的业务逻辑
 * 提示:接口里的代码注释必须写(分配任务:高级程序员,负责写Presenter层,写业务逻辑,定义接口,中级程序员负责写VIew层,更新数据用接口)
 */
public interface UserLoginPresenterInterface {
    /**
     * 登录成功
     */
    void success();

    /**
     * 登录失败
     */
    void failed();
}

private UserLoginPresenterInterface mUserLoginPresenterInterface;

}

MainActvity中

public class MainActivity extends AppCompatActivity implements View.OnClickListener, UserLoginPresenter.UserLoginPresenterInterface {

//视图层
private EditText mUsername;
private EditText mPassword;
private Button login;
private ProgressDialog mProgressDialog;
private UserLoginPresenter mUserLoginPresenter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //进行控件初始化
    initView();
    //动态的创建一个进度条,视图层
    mProgressDialog = new ProgressDialog(this);

    //创建presenter类对象,把Activity的业务逻辑的类对象拆分出去,把Activity对象传进去
    mUserLoginPresenter = new UserLoginPresenter(this);//此处如果没有导入UserLoginPersenter类中的方法success和failed则this会报错
}

//点击按钮,上传用户信息
@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.login:
            //视图层
            final String  username= mUsername.getText().toString().trim();
            final String  password= mPassword.getText().toString().trim();
            //创建Bean类,然后把数据放到bean类里,视图层
            final User user = new User();
            user.username=username;
            user.password=password;

            //判断信息是否为null,业务逻辑层
            boolean userInfo = mUserLoginPresenter.submit(user);
            //也是业务逻辑.****
            if (userInfo){
                //显示进度条,视图层
                mProgressDialog.show();
                //1.使用presenter,这个处理业务逻辑的类,对用户输入信息是否正确进行判断
                mUserLoginPresenter.login(user);
            }else {
                //视图层
                Toast.makeText(MainActivity.this, "输入不能为null,么么哒", Toast.LENGTH_SHORT).show();
            }
            break;
    }
}
public void success() {
    //5.登录成功的逻辑,谈一个吐司,更新UI       视图层
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            //7.关闭进度条,弹吐司
            mProgressDialog.dismiss();
            Toast.makeText(MainActivity.this, "欢迎回来,思密达", Toast.LENGTH_SHORT).show();
        }
    });
}

public void failed() {
    //登录失败的逻辑,谈一个吐司,更新UI    视图层
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            //关闭进度条
            mProgressDialog.dismiss();
            Toast.makeText(MainActivity.this, "您的信息有误,请重新填写", Toast.LENGTH_SHORT).show();
        }
    });
}

//初始化控件     视图层
private void initView() {
    mUsername = (EditText) findViewById(username);
    mPassword = (EditText) findViewById(R.id.password);
    login = (Button) findViewById(R.id.login);

    login.setOnClickListener(this);
}

/**
 * 防止内存泄漏,将实现的接口对象设置为null
 */
@Override
protected void onDestroy() {
    super.onDestroy();
    mUserLoginPresenter=null;
}

}

猜你喜欢

转载自blog.csdn.net/weixin_43117800/article/details/83860886