布局实现用户名密码输入框点击登录按钮
<?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;
}
}