随着工作中的学习,发现从前在一个activity里写一千多行代码简直太low了。这样查找不方便的同时对解耦也是很不友好,经过网上的几遍文章总结,MVC、MVP都是一种设计项目的模式,MVP更适合android的开发,有效的解耦同时把activity的功能单一化只是负责view的展示,其他的逻辑和数据都通过model和presenter来处理,主要是面向接口的编程,这样便于扩展和后期维护。下面随意模仿了MVP模式写了一个简单的登录demo。
我们先来看一下项目结构
如果想用MVP来写项目的同学一定要多每个需求模块有很清晰的思路,虽然代码有些绕来绕去,但是结构很清晰。例如登陆的话就需要用户名和密码,实体类就好写了。
public class User { private String name; private String password; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
说到登录就少不了login和请求,下面是两个操作的接口
public interface IUserModel { public void login(String username,String password,OnLoginListener loginListener); }
public interface OnLoginListener { void LoginSuccess(User user); void LoginFailed(); }
请求就一定包括成功和失败
登录自然少不了用户名和密码,接下来我们在model里建一个处理登录业务
public class UserModel implements IUserModel { @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("wzh".equals(username) && "123".equals(password)){ User user=new User(); user.setName(username); user.setPassword(password); loginListener.LoginSuccess(user); }else{ loginListener.LoginFailed(); } } }).start(); } }
睡眠线程2秒实现模拟登陆情景,用户名和密码都是写死的。接下来就要想登录里都有哪些业务要在view中处理了
public interface IUserLoginView { String getUserName(); String getpassword(); void clearUserName(); void clearPassword(); void showLoading(); void hideLoading(); void toMainActivity(); void showFailedError(); }
根据常见登录总结了几点,获取用户名密码肯定要有,清除也要有,显示隐藏登录中的加载进度,首页的跳转,登录失败的返回结果。接下来就是主要的presenter中的处理了,在这个包下的类都是为了把model和view 之间搭建桥梁用的
public class UserLoginPresenter { private IUserModel iUserModel; private IUserLoginView iUserLoginView; private Handler handler=new Handler(); public UserLoginPresenter(IUserLoginView iUserLoginView) { this.iUserLoginView = iUserLoginView; this.iUserModel=new UserModel(); } public void login(){ iUserLoginView.showLoading(); iUserModel.login(iUserLoginView.getUserName(), iUserLoginView.getpassword(), new OnLoginListener() { @Override public void LoginSuccess(User user) { handler.post(new Runnable() { @Override public void run() { iUserLoginView.toMainActivity(); iUserLoginView.hideLoading(); } }); } @Override public void LoginFailed() { handler.post(new Runnable() { @Override public void run() { iUserLoginView.showFailedError(); iUserLoginView.hideLoading(); } }); } }); } public void clear(){ iUserLoginView.clearUserName(); iUserLoginView.clearPassword(); } }实现了自身的单例,将登陆和清除的逻辑处理整合到一起。最后view就是activity了
public class MainActivity extends AppCompatActivity implements View.OnClickListener,IUserLoginView{ private EditText name,password; private Button login,clear; private ProgressBar mProgressBar; private UserLoginPresenter userLoginPresenter=new UserLoginPresenter(this); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { name= (EditText) findViewById(R.id.name); password= (EditText) findViewById(R.id.password); login= (Button) findViewById(R.id.login); clear= (Button) findViewById(R.id.clear); mProgressBar= (ProgressBar) findViewById(R.id.loading); name.setOnClickListener(this); password.setOnClickListener(this); login.setOnClickListener(this); clear.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.login: userLoginPresenter.login(); break; case R.id.clear: userLoginPresenter.clear(); break; } } @Override public String getUserName() { return name.getText().toString(); } @Override public String getpassword() { return password.getText().toString(); } @Override public void clearUserName() { name.setText(""); } @Override public void clearPassword() { password.setText(""); } @Override public void showLoading() { mProgressBar.setVisibility(View.VISIBLE); } @Override public void hideLoading() { mProgressBar.setVisibility(View.GONE); } @Override public void toMainActivity() { Toast.makeText(getApplicationContext(),"跳转首页",Toast.LENGTH_SHORT).show(); } @Override public void showFailedError() { Toast.makeText(getApplicationContext(),"登陆失败",Toast.LENGTH_SHORT).show(); } }主要就是实现Model的业务处理接口,通过presenter 的传递,最后view只需要把数据显示出来就可以了
写的一般仅供各位同僚学习,谢谢