android 初识mvp

本次主要看一个mvp的简单demo,不熟悉mvc,mvp的请自行百度

目录结构如下

个人理解MVP模式是隔离了各层之间的交互
bean<->model<->presenter<->view
使得每一层的逻辑独立,功能明确,方便后期维护,接下来就看代码了
1.bean
public class UserBean {
	private String username;
	private String password;

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public UserBean() {
	}

}
2.model
2.1 ILoginModel(接口)
public interface ILoginModel {
	void login(String username, String password, OnLoginListener loginListener);
}
2.2 LoginModelImpl(实现类,业务类,此处模拟网络登录)
public class LoginModelImpl implements ILoginModel {

	@Override
	public void login(final String username, final String password,
			final OnLoginListener loginListener) {
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				try {
					Thread.sleep(2000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				if("123".equals(username) && "456".equals(password)){
					loginListener.loginSuccess();
				} else {
					loginListener.loginFailed();
				}
			}
		}).start();;
	}
2.3 OnLoginListener(监听)
public interface OnLoginListener {
	void loginSuccess();
	void loginFailed();
}
3 控制者 presenter,网络请求返回的结果通过handler交给UI线程处理,当然此处也可以用asynctask  eventbus等方式
public class LoginPresenter implements OnLoginListener {

	private static LoginActivity mMainActivity;
	private ILoginModel mLoginModel;
	/*//private OnLoginListener mLoginListener;*/
	private static Handler mHandler = new Handler() {
		public void handleMessage(android.os.Message msg) {

			switch (msg.what) {
			case 1:// login success
				mMainActivity.loginSuccess();
				break;
			case 2:// login failed
				mMainActivity.loginFailed();
				break;

			default:
				break;
			}
		};
	};

	public LoginPresenter(LoginActivity mainActivity) {
		mMainActivity = mainActivity;
		mLoginModel = new LoginModelImpl();
	}

	public String getUsername() {
		return mMainActivity.getUsername();
	}

	public String getPassword() {
		return mMainActivity.getPassword();
	}

	public void login(String username, String password) {
		mMainActivity.showProgress();
		mLoginModel.login(username, password, this);
	}

	public void clear() {
		mMainActivity.clear();
	}

	@Override
	public void loginSuccess() {
		Message msg = Message.obtain();
		msg.what = 1;
		mHandler.sendMessage(msg);
	}

	@Override
	public void loginFailed() {
		Message msg = Message.obtain();
		msg.what = 2;
		mHandler.sendMessage(msg);
	}
4 view层
4.1 view接口(ILoginView)
public interface ILoginView {
	String getUsername();
	String getPassword();
	void showProgress();
	void hideProgress();
	void loginSuccess();
	void loginFailed();
	void clear();
}
4.2 view实现 (UI显示,fragment或者activity)
public class LoginActivity extends Activity implements ILoginView, OnClickListener{
	
	private EditText mUsername;
	private EditText mPassword;
	private ProgressBar mPb;
	private Button mLogin;
	private Button mClear;
	private LoginPresenter mLoginPresenter;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mLoginPresenter = new LoginPresenter(this);
		initView();
	}

	private void initView() {
		mUsername = (EditText) findViewById(R.id.et_username);
		mPassword = (EditText) findViewById(R.id.et_password);
		mPb = (ProgressBar) findViewById(R.id.pb);
		mLogin = (Button) findViewById(R.id.login);
		mLogin.setOnClickListener(this);
		mClear = (Button) findViewById(R.id.clear);
		mClear.setOnClickListener(this);
		mPb.setVisibility(View.GONE);
	}

	@Override
	public String getUsername() {
			return mUsername.getText().toString();
	}

	@Override
	public String getPassword() {
			return mPassword.getText().toString();
	}

	@Override
	public void showProgress() {
		mPb.setVisibility(View.VISIBLE);
	}

	@Override
	public void hideProgress() {
		mPb.setVisibility(View.GONE);
	}

	@Override
	public void loginSuccess() {
		Toast.makeText(this, "success", 0).show();
		hideProgress();
	}

	@Override
	public void loginFailed() {
		Toast.makeText(this, "filed", 0).show();
		hideProgress();
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.login:
			mLoginPresenter.login(mLoginPresenter.getUsername(), mLoginPresenter.getPassword());
			break;
		case R.id.clear:
			mLoginPresenter.clear();
			break;

		default:
			break;
		}
	}

	@Override
	public void clear() {
		mUsername.setText("");
		mPassword.setText("");
	}

当业务非常简单的时候并不适合用mvp,可是当业务比较复杂的时候,这个时候就可以看到,各个层分离明显,功能划分明确,比如UI的错误肯定在view层去处理就OK了,不会影响到model。本人对mvp的好处体会也不深,项目中并没有用到,只是自行研究了下demo,如果想理解更深刻还是要用起来。








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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值