Android MVP模式学习
参考:
Android MVP 开发模式有哪些优缺点?: https://www.zhihu.com/question/35185744
MVP 模式简单易懂的介绍方式: http://kaedea.com/2015/10/11/android-mvp-pattern/
浅谈 MVP in Android:http://blog.csdn.net/lmj623565791/article/details/46596109
Android
开发中的 MVP
模式出现已经很久了,网上的资料也有很多,看了很多,不过感觉自己并没有深入理解 MVP
模式的精髓。
刚开始在工程中使用 MVP
模式进行开发时,很不适应,经过一段时候的实践,现在慢慢知道了如何进行开发。
MVP
模式的使用其实很简单,其背后却包含了深刻的思想,记录下这篇文章,在实践中方便查找
主要内容:
MVP
模式原理
MVP
模式原理
百度百科:MVP
维基百科:Model–view–presenter
MVP
全称:Model - View - Presenter
Model
表示数据层,View
表示视图层,Presenter
表示逻辑处理层
在 MVP
模式中
View
不和Model
进行直接交互,View
通过Presenter
将前端数据传给Model
,或者通过Presenter
从Model
中获取数据,View
和Model
所有的交互都发生在Presenter
中View
负责前端的展示以及与用户的交互Model
负责数据的存储以及调用
好处:能够有效解耦工程,分为各个独立模块,功能清晰,有利于重复使用,在调试过程中也能够快速定位错误
缺陷:增加代码工作量
结合 MVP
模式实现用户登录
MVP
模式实现用户登录
登录界面如下:
新建一个登录对象 Login
,用于保存用户名和密码
对数据有两个方面的处理:1 - 清除数据;2 - 验证登录,将其放置在 Presenter
中完成
对视图有两个方面的处理:1 - 清空编辑框;2 - 登录成功,则跳转,否则,提示登录错误
Note:下面仅给出关键代码,完整工程链接在文章末尾
用一个类 MainContract
包含接口:
public class MainContract {
public interface View extends BaseView<Presenter> {
void clearEdit();
void login(boolean isLogin, String username, String pwd);
}
public interface Presenter extends BasePresenter {
void doClear();
void doLogin(String username, String pwd);
}
}
在 Presenter
中实现 Model
与 View
的交互:
public class MainPresenter implements MainContract.Presenter {
MainContract.View vMain;
public MainPresenter(MainContract.View view) {
vMain = view;
vMain.setPresenter(this);
}
@Override
public void doClear() {
vMain.clearEdit();
}
@Override
public void doLogin(String username, String pwd) {
vMain.onLoading("正在验证...");
boolean flag = false;
if (username.equals("zj") && pwd.equals("123456")) {
flag = true;
}
vMain.loadingComplete();
vMain.login(flag, username, pwd);
}
}
View
实现前端展示及用户交互:
public class MainActivity extends BaseActivity implements MainContract.View {
public static final String TAG = MainActivity.class.getSimpleName();
@BindView(R.id.user)
EditText user;
@BindView(R.id.password)
EditText password;
@BindView(R.id.clear)
Button clear;
@BindView(R.id.login)
Button login;
private MainContract.Presenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
new MainPresenter(this);
}
@OnClick({R.id.clear, R.id.login})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.clear:
presenter.doClear();
break;
case R.id.login:
String username = user.getText().toString();
String pwd = password.getText().toString();
presenter.doLogin(username, pwd);
break;
}
}
@Override
public void setPresenter(MainContract.Presenter presenter) {
this.presenter = presenter;
}
@Override
public void onLoading(String text) {
showLoading(text);
}
@Override
public void loadingComplete() {
hideLoading();
}
@Override
public void loadingError(String error) {
}
@Override
public void clearEdit() {
user.setText(null);
password.setText(null);
user.requestFocus();
}
@Override
public void login(boolean isLogin, String username, String pwd) {
Log.e(TAG, "onViewClicked: user = " + username + " pwd = " + pwd);
if (isLogin) {
Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show();
Login lg = new Login(username, pwd);
Intent intent = new Intent(this, Main2Activity.class);
intent.putExtra("login", new Gson().toJson(lg));
startActivity(intent);
} else {
Toast.makeText(this, "登录失败", Toast.LENGTH_SHORT).show();
}
}
}
结合 MVP
模式实现 ViewPager + TabLayout + Fragment + RecyclerView
MVP
模式实现 ViewPager + TabLayout + Fragment + RecyclerView
在 Fragment
中实现 MVP
模式和 Activity
类似,用户登录成功(User: zj, pwd: 123456
)后,跳转到一个数据展示界面
展示界面如下:
工程代码及其他
其实对与 MVP
还是一知半解,不过先记录下来,以后再慢慢补充
完整工程链接:MVPDemo