MVP开发在Android中的基本流程
- View层,一般由Activity或者是Fragment来实现这个接口,它定义了View视图的各种变化,如设置Textview,加载对话框,更新进度条等。
- Model层,用来定义数据层发生变化时的通知接口,因为Model不能直接与View交互,所以它与Presenter交互,然后再通过Presenter间接达到与View的交互。
- Presenter翻译的意思是主持人,也就是主持场合,控制节奏的意思。Presenter就负责具体的业务逻辑,请求数据,把数据送到Model层,或者监听Model的数据变化,接受View层的动作,负责通过通知View层的视图变化。
MVP模式
简单的登录界面实现
-
首先创建MVP的目录结构,这里的目录结构不是唯一的,可以根据自己的习惯进行构建。
目录结构
- 编写Contract用来存放Presenter层和View层的所有方法,使用Contract的好处是可以清楚地了解所有的功能,代码比较清晰,里面定义了View和Presenter的接口形式,可以快速查看各个方法。
public interface LoginInterface {
interface View{
public String getAccount();
public String getPassword();
public void showToast(String msg);
}
interface Presenter{
public void onSuccess();
public void onFailure();
public void onAccountError();
public void onPasswordError();
}
}
- Presenter层主要负责业务逻辑,响应View层的请求,从Model层获得的数据传递到View层显示。编写Presenter层的实现代码,新建一个LoginPresenter类,实现Contract里面的Presenter接口,实现接口的方法
public class LoginPresenter implements LoginInterface.Presenter{
//Presenter层负责Model层和View层的交互对接,因此要实现他们的接口引用
private LoginInterface.View view;
private Model model;
public LoginPresenter(LoginInterface.View view) {
this.view = view;
model = new LoginModel();
}
/**
* 将从view层中获取的用户名和密码传送给Model层
* 然后让activity中的登录按钮调用此方法
*/
public void login(){
//从View层获取输入的账户名和密码
String username = view.getAccount();
String password = view.getPassword();
//将View层获取的数据传递到Model层
model.login(username,password,this);
}
@Override
public void onSuccess() {
view.showToast("success");
}
@Override
public void onFailure() {
view.showToast("failure");
}
@Override
public void onAccountError() {
view.showToast("用户名错误");
}
@Override
public void onPasswordError() {
view.showToast("密码错误");
}
}
- Model层,主要就是网络请求数据,数据库操作,文件读写,涉及内存数据缓存的代码,最后一定需要用 Presenter 层定义的接口,回调给 Presenter 通知 View 层 更新数据。
public class LoginModel implements Model{
@Override
public void login(String account, String password, LoginInterface.Presenter prenster) {
if(account.equals("admin")&&password.equals("123456")){
prenster.onSuccess();//登录成功
}else if(!account.equals("admin")||!password.equals("123456")){
prenster.onAccountError();//用户名或者密码错误
}else {
prenster.onFailure();//登录失败
}
}
}
- View层,主要用于处理视图展示逻辑,监听用户事件并提交给P层进行业务逻辑处理,编写LoginActivity实现View层的功能。
public class LoginActivity extends AppCompatActivity implements LoginInterface.View{
private EditText edit_account;
private EditText edit_password;
private Button commit;
private Button cancel;
//从视图界面出发用户要请求数据,需要通过Presenter层进行交互,要通过Presenter的引用
private LoginPresenter loginPresenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
edit_account = findViewById(R.id.edit_account);
edit_password = findViewById(R.id.edit_password);
commit = findViewById(R.id.commit);
cancel = findViewById(R.id.cancel);
loginPresenter = new LoginPresenter(this);
commit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
loginPresenter.login();
}
});
}
@Override
public String getAccount() {
return edit_account.getText().toString().trim();
}
@Override
public String getPassword() {
return edit_password.getText().toString().trim();
}
@Override
public void showToast(String msg) {
Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();
}
}
登录界面的xml文件添加简单的文本编辑控件和登录按钮等。
登录成功登录失败
网友评论