刚刚开始写代码的时候,凭着自己的灵感想到什么就写什么,整个项目都是面向过程写下来,一个类就2-3千行代码,满满的成就感。当项目需求变更的时候才知道什么是痛苦,往往一个很小的改动,但是修改的代码确很多,而且不知道会不会出现漏修改的地方或者修改了某一个地方对其他类有没有影响,牵一发动全身,这时候我宁愿项目经理来牵我的头发也不想去修改这堆代码,所以我开始了解mvp开发模式,不再让经理牵我的头发。到底什么是mvp模式?很多人普遍认为代码清晰了同时增加了很多类。也有人会觉得增加那么多类太麻烦了,但是我想说增加很多类会让你的头发不再掉,相信我mvp模式会让你拥有乌黑浓密的秀发。那么mvp模式是怎么样的呢?据我所知肯定是杀人最多、死亡最少、经济最高、推塔无数的王者,嗯,一定是这样的。但。。。
现在是这样的:
View 对应于Activity,负责View的绘制以及与用户交互
Model 依然是业务逻辑和实体模型
Presenter 负责完成View于Model间的交互
想不到吧,老实说我也想不到,难怪我一直拿不到lol的mvp。下面通过简单的demo来展示下mvp模式。界面如下
项目结构如下
接下来就是如何实现了
首先从最简单的实体类
package com.example.mymvp.entity;
public class LoginInfo {
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;
}
}
然后就是modle模型了,这里只有一个login方法
package com.example.mymvp.modle; import com.example.mymvp.entity.LoginInfo; public class LoginModle { public boolean login(LoginInfo l){ try { Thread.sleep(3000); if (l.getUsername().equals("123456") && l.getPassword().equals("123456")) { return true; } } catch (InterruptedException e) { e.printStackTrace(); } return false; }; }
其次就是用于presenter跟view交互的接口了,里面的方法可根据需求自己定义,难点也是设计拥有什么方法,这是mvp模式亮点啊
package com.example.mymvp.listener; import com.example.mymvp.entity.LoginInfo; public interface LoginView { //获取用户名字 String getUsername(); //获取用户密码 String getPassword(); //登陆成功 void success(); //登陆失败 void error(); //正在加载 void loading(); //得到登陆信息 LoginInfo getLoginInfo(); }
最后就是presenter类,作为新英雄到底有什么技能呢,看了界面就知道只有login一个技能了,我不愧是青铜五中的佼佼者。
package com.example.mymvp.presenter; import com.example.mymvp.listener.LoginView; import com.example.mymvp.modle.LoginModle; import android.app.Activity; public class LoginPresenter { private LoginModle loginModle; private LoginView loginView; public LoginPresenter( LoginView loginView) { super(); this.loginModle = new LoginModle(); this.loginView = loginView; } public void login(){ loginView.loading(); new Thread(){ public void run() { if(loginModle.login(loginView.getLoginInfo())){ ((Activity)loginView).runOnUiThread(new Runnable() { @Override public void run() { //主线程更新ui loginView.success(); } }); }else{ ((Activity)loginView).runOnUiThread(new Runnable() { @Override public void run() { //主线程更新ui loginView.error(); } }); } }; }.start(); } }
最后就是activity了
package com.example.mymvp; import com.example.mymvp.entity.LoginInfo; import com.example.mymvp.listener.LoginView; import com.example.mymvp.presenter.LoginPresenter; import android.app.Activity; import android.app.ProgressDialog; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity implements LoginView { private EditText username_et; private EditText password_et; private ProgressDialog dialog; private Button login_bt; private LoginPresenter presenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intiview(); presenter = new LoginPresenter(this); login_bt.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { presenter.login(); } }); } private void intiview() { username_et = (EditText) findViewById(R.id.username_et); password_et = (EditText) findViewById(R.id.password_et); login_bt = (Button) findViewById(R.id.login); dialog = new ProgressDialog(this); } @Override public String getUsername() { return username_et.getText().toString(); } @Override public String getPassword() { return password_et.getText().toString(); } @Override public void success() { Toast.makeText(MainActivity.this, "登陆成功", Toast.LENGTH_SHORT).show(); dialog.dismiss(); } @Override public void error() { Toast.makeText(MainActivity.this, "登陆失败", Toast.LENGTH_SHORT).show(); dialog.dismiss(); } @Override public void loading() { dialog.show(); } @Override public LoginInfo getLoginInfo() { // TODO Auto-generated method stub LoginInfo l = new LoginInfo(); l.setUsername(getUsername()); l.setPassword(getPassword()); return l; } }
好了,整个项目就是这样子的了。以上都是我自己的理解,如有不对的地方还需要大神们多多指教,毕竟我还是青铜五的菜鸟。虽然是个菜鸟但我们也有有一个mvp王者梦。
项目下载地址:http://download.csdn.net/detail/qq819715035/9792059