android快速学会mvp,Android---MVP学习之路(一)

什么是MVP,网上到处都是,这里就不说了。

总归MVP的优点是:

1.业务逻辑与View和Model分离,需求变更的时候修改起来简单

2.方便单元测试

我们就从一个最简单的需求(登录),来一步一步理解mvp。一个用户名输入框,一个密码输入框,一个登录按钮,一个清除按钮。如图:

d146e1c82fe0

图片.png

步骤1:创建mvp中的m

mvp中的m包括bean(实体类)和biz(业务逻辑),一般的bean我们是通过网络请求得到json数据,然后通过gson解析成bean。这里因为是模拟登录情况,所以没有实体类。

登录页面的话,需要创建处理登录的业务类,业务类是放在biz文件夹下,写一个登录业务的接口和实现类。建议命名方式的是接口后缀为interface,实现类的后缀为Imp,因为这样子命名的话,接口和实现类是在一起的。方便查找。

登录的业务接口:

public interface LoginBizInterface {

public void login(String name, String password, OnLoginListener onLoginListener);

}

登录的业务实现:

public class LoginBizImp implements LoginBizInterface {

@Override

public void login(final String name, final String password, final OnLoginListener onLoginListener) {

new Thread(new Runnable() {

@Override

public void run() {

try {

Thread.sleep(5000);

} catch (Exception e) {

}

if ("hpd".equals(name) && "123456".equals(password)) {

onLoginListener.success();

} else {

onLoginListener.failure();

}

}

}).start();

}

}

登录结果的接口回调:

public interface OnLoginListener {

public void success();

public void failure();

}

步骤2:创建mvp中的v

在mvp中,activity/fragment归属于view层。

我们需要创建view层的接口,作用是通过presenter来促使view作出相应相互。现在我们的页面有一个登录的按钮,需要获取用户名和密码。清除按钮需要清除用户名和密码;登录成功需要跳转页面;显示进度条,隐藏进度条,Toast错误。所以该接口有以下方法:

public interface LoginViewInterface {

public String getUserName();

public String getUserPassword();

public void clearName();

public void clearPassword();

public void go2OtherActivity();

public void showLoading();

public void hideLoading();

public void showFailError(String message);

}

然后LoginActivity去实现LoginViewInterface

public class LoginActivity extends AppCompatActivity implements LoginViewInterface {

private EditText etName, etPassword;

private Button btnLogin, btnClear;

protected ProgressDialog progressDialog;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_login);

progressDialog = new ProgressDialog(this);

initView();

}

private void initView() {

etName = findViewById(R.id.et_name);

etPassword = findViewById(R.id.et_password);

btnLogin = findViewById(R.id.btn_login);

btnClear = findViewById(R.id.btn_clear);

}

@Override

public String getUserName() {

return etName.getText().toString().trim();

}

@Override

public String getUserPassword() {

return etPassword.getText().toString().trim();

}

@Override

public void clearName() {

etName.setText("");

}

@Override

public void clearPassword() {

etPassword.setText("");

}

@Override

public void go2OtherActivity() {

Toast.makeText(this, "go2OtherActivity", Toast.LENGTH_SHORT).show();

}

@Override

public void showLoading() {

progressDialog.setMessage("showLoading");

if (!progressDialog.isShowing()) {

progressDialog.show();

}

}

@Override

public void hideLoading() {

if (progressDialog.isShowing()) {

progressDialog.dismiss();

}

}

@Override

public void showFailError(String message) {

if (TextUtils.isEmpty(message)) {

message = "发生错误";

}

Toast.makeText(this, message, Toast.LENGTH_SHORT).show();

}

}

步骤3:创建mvp中的p

创建presenter是看view中的交互事件,view只有登录,清除两个交互事件,所以我们在presenter中定义两个方法。

public class LoginPresenter {

private LoginViewInterface loginViewInterface;

private Handler handler = new Handler(Looper.getMainLooper());

private LoginBizImp loginBizImp;

public LoginPresenter(LoginViewInterface loginViewInterface) {

this.loginViewInterface = loginViewInterface;

this.loginBizImp = new LoginBizImp();

}

public void login() {

loginViewInterface.showLoading();

loginBizImp.login(loginViewInterface.getUserName(), loginViewInterface.getUserPassword(), new OnLoginListener() {

@Override

public void success() {

handler.post(new Runnable() {

@Override

public void run() {

loginViewInterface.hideLoading();

loginViewInterface.go2OtherActivity();

}

});

}

@Override

public void failure() {

handler.post(new Runnable() {

@Override

public void run() {

loginViewInterface.showFailError("登录失败");

loginViewInterface.hideLoading();

}

});

}

});

}

public void clear() {

loginViewInterface.clearName();

loginViewInterface.clearPassword();

}

}

步骤4:在activity中结合presenter

public class LoginActivity extends AppCompatActivity implements LoginViewInterface {

private EditText etName, etPassword;

private Button btnLogin, btnClear;

protected ProgressDialog progressDialog;

private LoginPresenter loginPresenter;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_login);

progressDialog = new ProgressDialog(this);

initView();

loginPresenter = new LoginPresenter(this);

}

private void initView() {

etName = findViewById(R.id.et_name);

etPassword = findViewById(R.id.et_password);

btnLogin = findViewById(R.id.btn_login);

btnClear = findViewById(R.id.btn_clear);

btnLogin.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

loginPresenter.login();

}

});

btnClear.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

loginPresenter.clear();

}

});

}

@Override

public String getUserName() {

return etName.getText().toString().trim();

}

@Override

public String getUserPassword() {

return etPassword.getText().toString().trim();

}

@Override

public void clearName() {

etName.setText("");

}

@Override

public void clearPassword() {

etPassword.setText("");

}

@Override

public void go2OtherActivity() {

Toast.makeText(this, "go2OtherActivity", Toast.LENGTH_SHORT).show();

}

@Override

public void showLoading() {

progressDialog.setMessage("showLoading");

if (!progressDialog.isShowing()) {

progressDialog.show();

}

}

@Override

public void hideLoading() {

if (progressDialog.isShowing()) {

progressDialog.dismiss();

}

}

@Override

public void showFailError(String message) {

if (TextUtils.isEmpty(message)) {

message = "发生错误";

}

Toast.makeText(this, message, Toast.LENGTH_SHORT).show();

}

}

好了,mvp的最简单的demo已经完成,主要是为了快速理解mvp。相信你已经对mvp有一个大体的认知,但是到现在还有很有问题。请看 Andriod---MVP学习之路(二)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值