Android MVP模式深入实践探索(一),安卓开发面试问题

android:textColor="@color/black" />

<EditText

android:id="@+id/edit_user_password"

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:inputType=“textPassword”

android:maxLines=“1”

android:hint=“请输入密码”

android:textSize=“16sp”

android:textColor="@color/black" />

<Button

android:id="@+id/btn_login"

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:layout_marginTop=“20dp”

android:text=“登录”

android:textSize=“16sp”

android:textColor="@color/black"

/>

LoginActivity代码:

public class LoginActivity extends Activity implements View.OnClickListener {

private EditText mUserNameEdit;

private EditText mUserPasswordEdit;

private Button mLoginBtn;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_login);

initView();

}

private void initView() {

mUserNameEdit = (EditText) findViewById(R.id.edit_user_name);

mUserPasswordEdit = (EditText) findViewById(R.id.edit_user_password);

mLoginBtn = (Button) findViewById(R.id.btn_login);

mLoginBtn.setOnClickListener(this);

}

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.btn_login:

//TODO

break;

default:

break;

}

}

}

如果是传统的MVC的话,到这一步基本就结束了,接下来就开始在LoginActivity中搞事情作死了。。

如果使用MVP的话,接下来我们需要建立几个package来存放对应的角色:

在这里插入图片描述

其中view包下存放activity、fragment等UI控件,iview包下存放presenter与view进行交互的接口类,我们把LoginActivity放入view/activity包中:

在这里插入图片描述

其他包下面的情况:

在这里插入图片描述

在MVP中为了解耦Presenter跟View和Model的交互都通过接口进行,所以新建一个跟LoginActivity交互的接口类ILoginView

public interface ILoginView {

/** 获取输入框的登录用户名 */

String getUserName();

/** 获取输入框的用户密码 */

String getUserPassword();

/** 显示Toast提醒 */

void showToast(String msg);

/** 登录成功的UI处理 */

void onLoginSuccess();

/** 登录失败的UI处理 */

void onLoginFail();

/** 显示加载中弹窗 */

void showProgressDialog();

/** 隐藏加载中弹窗 */

void hideProgressDialog();

/** 获取当前UI页面的上下文 */

Context getContext();

}

view接口类中定义的基本都是一些UI数据或者显示UI控件的方法,然让LoginActivity实现这个接口:

public class LoginActivity extends Activity implements ILoginView, View.OnClickListener {

private EditText mUserNameEdit;

private EditText mUserPasswordEdit;

private Button mLoginBtn;

public ProgressDialog mProgressDialog;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_login);

initView();

}

private void initView() {

mUserNameEdit = (EditText) findViewById(R.id.edit_user_name);

mUserPasswordEdit = (EditText) findViewById(R.id.edit_user_password);

mLoginBtn = (Button) findViewById(R.id.btn_login);

mLoginBtn.setOnClickListener(this);

}

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.btn_login:

//TODO

break;

default:

break;

}

}

@Override

public String getUserName() {

return mUserNameEdit.getText().toString();

}

@Override

public String getUserPassword() {

return mUserPasswordEdit.getText().toString();

}

@Override

public void showToast(String msg) {

ToastUtils.showToast(this, msg);

}

@Override

public void onLoginSuccess() {

ToastUtils.showToast(this, “登录成功”);

//跳转首页

gotoHomeActivity();

finish();

}

@Override

pu
blic void onLoginFail() {

ToastUtils.showToast(this, “登录失败”);

}

@Override

public void showProgressDialog() {

if (mProgressDialog == null) {

mProgressDialog = DialogUtils.showSpinningProgressDialog(this, “正在登录中…”, false);

} else {

if (!mProgressDialog.isShowing()) {

mProgressDialog.show();

}

}

}

@Override

public void hideProgressDialog() {

if (mProgressDialog != null) {

mProgressDialog.dismiss();

}

}

@Override

public Context getContext() {

return this;

}

/** 跳转首页 */

private void gotoHomeActivity() {

Intent intent = new Intent(this, MainActivity.class);

startActivity(intent);

}

}

View层到此就完事了,接下来实现PresenterModel角色的接口和实现类

Presenter接口和实现类:

public interface ILoginPresenter {

/** 登录操作逻辑处理 */

void login();

/** 登录成功逻辑处理 */

void onLoginSuccess();

/** 登录失败逻辑处理 */

void onLoginFail(String errMsg);

}

public class LoginPresenter implements ILoginPresenter {

private ILoginView mLoginView;

private ILoginModel mLoginModel;

public LoginPresenter(ILoginView loginView) {

mLoginView = loginView;

mLoginModel = new LoginModelImpl(this);

}

@Override

public void login() {

// 对用户名和密码的校验逻辑,这里只简单判空,实际可以加更多校验

if (TextUtils.isEmpty(mLoginView.getUserName())) {

mLoginView.showToast(“请输入用户名”);

return;

}

if (TextUtils.isEmpty(mLoginView.getPassword())) {

mLoginView.showToast(“请输入密码”);

return;

}

//判断网络是否可用

if (!NetUtils.checkNetState(mLoginView.getContext())) {

mLoginView.showToast(“当前无网络连接,请检查网络”);

return;

}

//显示登录进度弹窗

mLoginView.showProgressDialog();

//调用model层发起登录请求

mLoginModel.sendLoginRequest(mLoginView.getUserName(), mLoginView.getPassword());

}

/** 登陆成功 */

@Override

public void onLoginSuccess() {

//隐藏登录进度弹窗

mLoginView.hideProgressDialog();

//回调View层接口

mLoginView.onLoginSuccess();

}

/** 登陆失败 */

@Override

public void onLoginFail(String errMsg) {

//隐藏登录进度弹窗

mLoginView.hideProgressDialog();

//回调View层接口

mLoginView.onLoginFail(errMsg);

}

}

可以看到在LoginPresenter的实现类当中分别持有了ILoginViewILoginModel两个接口,LoginPresenter通过这两个接口分别与LoginActivity和LoginModel进行交互。其中ILoginView变量是通过构造函数传递进来的,而ILoginModel则是在构造函数内部创建的。

Model接口和实现类:

public interface ILoginModel {

/** 发起登录请求 */

void sendLoginRequest(String userName, String password);

}

public class LoginModelImpl implements ILoginModel {

private static final String API_LOGIN = “/mobile/login”;

private ILoginPresenter mPresenter;

public LoginModelImpl(ILoginPresenter mPresenter) {

this.mPresenter = mPresenter;
ILoginModel两个接口,LoginPresenter通过这两个接口分别与LoginActivity和LoginModel进行交互。其中ILoginView变量是通过构造函数传递进来的,而ILoginModel则是在构造函数内部创建的。

Model接口和实现类:

public interface ILoginModel {

/** 发起登录请求 */

void sendLoginRequest(String userName, String password);

}

public class LoginModelImpl implements ILoginModel {

private static final String API_LOGIN = “/mobile/login”;

private ILoginPresenter mPresenter;

public LoginModelImpl(ILoginPresenter mPresenter) {

this.mPresenter = mPresenter;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值