理解MVP
效果图:
项目结构:
实现
一、Model层
首先定义一个实体类User,其次就是业务类,抽取了一个接口 IUserBiz,在这个登录界面连接服务器只有一个登录方法 Login() ,耗时操作需要开辟子线程,再用一个回调接口来通知登录的状态,成功或者失败
package demo.example.com.mvp3.bean; /** * Created by Administrator on 2018/5/9 0009. */ public class User { 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; } }
package demo.example.com.mvp3.biz; /** * Created by Administrator on 2018/5/9 0009. */ public interface IUserBiz { void login(String name, String pwd, OnLoginListener listener); }
package demo.example.com.mvp3.biz; import demo.example.com.mvp3.bean.User; /** * Created by Administrator on 2018/5/9 0009. */ public interface OnLoginListener { void loginSuccess(User user); void loginFaild(); }
package demo.example.com.mvp3.biz; import demo.example.com.mvp3.bean.User; /** * Created by Administrator on 2018/5/9 0009. */ public class UserBiz implements IUserBiz { @Override public void login(final String name, final String pwd, final OnLoginListener listener) { new Thread() { @Override public void run() { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } if ("yl".equals(name) && "123456".equals(pwd)) { User user = new User(); user.setUsername(name); user.setPassword(pwd); listener.loginSuccess(user); } else { listener.loginFaild(); } } }.start(); } }
扫描二维码关注公众号,回复:
420437 查看本文章
二、Presenter层
本来应该放到View层后面说的,个人感觉放在前面更利于理解MVP整体流程的搭建,界面整体的用户交互的功能有两个,“登录”和“清除”,所以Presenter中有两个方法,即 login() 和 clear()
package demo.example.com.mvp3.presenter; import android.os.Handler; import android.widget.ProgressBar; import demo.example.com.mvp3.bean.User; import demo.example.com.mvp3.biz.IUserBiz; import demo.example.com.mvp3.biz.OnLoginListener; import demo.example.com.mvp3.biz.UserBiz; import demo.example.com.mvp3.view.IUserLoginView; /** * Created by Administrator on 2018/5/9 0009. */ public class UserLoginPresenter { private IUserBiz userBiz; private IUserLoginView userLoginView; private Handler mHandler = new Handler(); public UserLoginPresenter(IUserLoginView userLoginView) { this.userLoginView = userLoginView; this.userBiz = new UserBiz(); } public void Login() { userLoginView.showLoading(); userBiz.login(userLoginView.getName(), userLoginView.getPwd(), new OnLoginListener() { @Override public void loginSuccess(User user) { //需要在UI线程执行 mHandler.post(new Runnable() { @Override public void run() { userLoginView.toMainActivity(); userLoginView.hideLoading(); } }); } @Override public void loginFaild() { //需要在UI线程执行 mHandler.post(new Runnable() { @Override public void run() { userLoginView.showFaildError(); userLoginView.hideLoading(); } }); } }); } public void clear() { userLoginView.clearName(); userLoginView.clearPwd(); } }
三、View层
再考虑用户操作后的UI上面的逻辑
package demo.example.com.mvp3.view; /** * Created by Administrator on 2018/5/9 0009. */ public interface IUserLoginView { String getName(); String getPwd(); void showLoading(); void hideLoading(); void toMainActivity(); void showFaildError(); void clearName(); void clearPwd(); }
package demo.example.com.mvp3.view; import android.content.Intent; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ProgressBar; import android.widget.Toast; import demo.example.com.mvp3.MainActivity; import demo.example.com.mvp3.R; import demo.example.com.mvp3.presenter.UserLoginPresenter; /** * Created by Administrator on 2018/5/9 0009. */ public class UserLoginActivity extends AppCompatActivity implements IUserLoginView { private EditText etName, etPwd; private Button btnLogin, btnClear; private ProgressBar pbLogin; private UserLoginPresenter userLoginPresenter = new UserLoginPresenter(this); @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); initView(); } private void initView() { etName = findViewById(R.id.user_name); etPwd = findViewById(R.id.user_pwd); btnLogin = findViewById(R.id.btn_login); btnClear = findViewById(R.id.btn_clear); pbLogin = findViewById(R.id.pb_login); btnLogin.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { userLoginPresenter.Login(); } }); btnClear.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { userLoginPresenter.clear(); } }); } @Override public String getName() { return etName.getText().toString(); } @Override public String getPwd() { return etPwd.getText().toString(); } @Override public void showLoading() { pbLogin.setVisibility(View.VISIBLE); } @Override public void hideLoading() { pbLogin.setVisibility(View.GONE); } @Override public void toMainActivity() { startActivity(new Intent(this, MainActivity.class)); } @Override public void showFaildError() { Toast.makeText(this, "名字还是密码写错啦!", Toast.LENGTH_SHORT).show(); } @Override public void clearName() { etName.setText(""); } @Override public void clearPwd() { etPwd.setText(""); } }