MVP架构模式制作登录页面
来源:互联网 发布:数控铣削平面编程实例 编辑:程序博客网 时间:2024/06/05 19:48
为什么需要MVP
关于什么是MVP,以及MVC、MVP、MVVM有什么区别,这类问题网上已经有很多的讲解,你可以自行搜索或看看文末的参考文章,这里就只讲讲为什么需要MVP。
在Android开发中,Activity并不是一个标准的MVC模式中的Controller,它的首要职责是加载应用的布局和初始化用户界面,并接受并处理来自用户的操作请求,进而作出响应。但是,随着界面及其逻辑的复杂度不断提升,Activity类的职责不断增加,以致很容易变得庞大而臃肿。
越小的类,bug越不容易出现,越容易调试,更容易测试,我相信这一点大家是都赞同的。在MVP模式下,View和Model是完全分离没有任何直接关联的(比如你在View层中完全不需要导Model的包,也不应该去关联它们)。
使用MVP模式能够更方便的帮助Activity(或Fragment)职责分离,减小类体积,使项目结构更加清晰。
下面开始创建一个简单的MVP架构
首先开始建包
这个是Bean包里的Userinfo 然后我插多了一张图片 由于本人不会撤回 所以就凑合看看
这是延时操作
接下来就是SharedPreferences 进行密码保存
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.SystemClock;
import android.widget.Toast;
import com.example.day1mvp.model.IUserLoginModel;
import com.example.day1mvp.model.UserLoginModel;
import com.example.day1mvp.view.IUserLoginView;
* Created by yfeng on 2017/9/26.
*/
IUserLoginModel model;
IUserLoginView view;
Context context;
this.view = view;
this.context = context;
model = new UserLoginModel(context);
}
UserInfo info = model.getUserInfo();
view.setTextName(info.getName());
view.setTextPass(info.getPass());
}
final String name = view.getTextName();
final String pass = view.getTextPass();
//
model.saveUserInfo(name, pass);
}
final String name = view.getTextName();
final String pass = view.getTextPass();
if(!name.equals("123")){
Toast.makeText(context, "用户名错误", Toast.LENGTH_SHORT).show();
return;
}
new AsyncTask<String, String ,String >(){
protected String doInBackground(String... params) {
model.login(name, pass);
return null;
}
protected void onPostExecute(String s) {
super.onPostExecute(s);
model.saveUserInfo(name, pass);
Toast.makeText(context, "登录成功", Toast.LENGTH_SHORT).show();
}
}.execute();
}
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import com.example.day1mvp.view.IUserLoginView;
EditText et_name, et_pass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_name = (EditText) findViewById(R.id.et_name);
et_pass = (EditText) findViewById(R.id.et_pass);
presenter = new LoginPresenter(this, this);
presenter.showUserInfo();
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
presenter.login();
}
});
}
public void setTextName(String name) {
et_name.setText(name);
}
public void setTextPass(String pass) {
et_pass.setText(pass);
}
public String getTextName() {
return et_name.getText().toString();
}
public String getTextPass() {
return et_pass.getText().toString();
}
}
AndroidMVP存在的问题
但是在用的时候会出现一些问题:
1. 例如当应用进入后台且内存不足的时候,系统是会回收这个Activity的。通常我们都知道要用OnSaveInstanceState()
去保存状态,用OnRestoreInstanceState()
去恢复状态。 但是在我们的MVP中,View层是不应该去直接操作Model的,这样做不合理,同时也增大了M与V的耦合。
2. 界面复用问题。通常我们在APP最初版本中是无法预料到以后会有什么变动的,例如我们最初使用一个Fragment去作为界面的显示,后来在版本变动中发现这个Fragment越来越庞大,而Fragment的生命周期又太过复杂造成很多难以理解的BUG,我们需要把这个界面放到一个Activity中实现。这时候就麻烦了,要把Fragment转成Activity,这可不仅仅是改改类名的问题,更多的是一大堆生命周期需要去修改。例如参考文章2中的译者就遇到过这样的问题。
3. Activity本身就是Android中的一个Context。不论怎么去封装,都难以避免将业务逻辑代码写入到其中。
TheMVP原理介绍
与传统androidMVP不同(原因上文已经说了),TheMVP使用Activity作为Presenter层来处理代码逻辑,通过让Activity包含一个ViewDelegate对象来间接操作View层对外提供的方法,从而做到完全解耦视图层。如下图:
- MVP架构模式制作登录页面
- MVP架构,登录页面
- 登录注册mvp模式
- MVP架构模式详解
- MVP架构模式
- android-MVP架构模式
- mvp架构模式
- mvp架构模式
- MVP架构模式
- 细谈MVP架构模式
- Android|MVP架构模式
- MVP应用架构模式
- MVP架构模式
- 浅谈mvp架构模式
- MVP应用架构模式
- MVP架构模式详解
- 从MVP登录Demo理解MVP模式
- MVP模式实现登录功能
- HttpURLConnection一个适配器加载图片的类
- JAVA注意事项(二)
- HTML的响应式和多媒体技术
- HDU 4474(Yet Another Multiple Problem)(BFS+同余定理)
- arc(逆欧拉函数)
- MVP架构模式制作登录页面
- 关于DBUtils中QueryRunner的一些解读
- AngularJS简介
- Karaf教程第5部分-在OSGi中运行 Apache Camel集成
- lua脚本学习1
- springmvc interceptor拦截器 <mvc:mapping path="/**" />
- 硬币排成线 II-LintCode
- 第十三章 表格 框架
- 【转】java图片处理