admin 管理员组

文章数量: 887007

用MVP模式构建Android代码

用MVP模式构建Android代码

一、MVP简介

​ 在进行软件开发过程中,我们通常会使用设计模式来辅助我们构建代码,以实现代码的可维护性和可复用性。而MVC模式是开发人员最了解的一个模式,MVP就是以MVC为基础发展演变而来的。

MVC模式:

首先我们先来回顾一下MVC模式:

MVC模式即Model(模型)-view(视图)-controller(控制器)

  • M:Model,代表业务数据和业务规则
  • V:View,代表用户界面
  • Controller,代表控制器,接受用户输入并调用模型和视图完成用户的请求

优点:MVC模式实现了M层和V层的代码分离,C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。此模式多运用在WEB开发。

缺点:MVC中Model、View、Controller之间相互发生通信。

MVP模式:

MVP模式在MVC的结构上将Controller层替换为Presenter层。

  • M:Model,代表业务数据和业务规则
  • V:View,代表用户界面
  • P:Presenter,连接Model和View

MVP模式在Android中使用:

1、View层View的interface,定义View的行为,然后使用Activity或是Fragment实现这个接口,它定义了视图的变化。

2、Model层定义Model的interface,用来定义数据层发生变化时的通知接口,因为Model不能直接与View交互,所以它与Presenter交互,然后再通过Presenter和View交互。

3、Presenter负责具体业务逻辑,请求数据,把数据送到Model,或者监听Model的数据变化,接受View层的动作。,负责通过View层的视图变化。

二、实例演示

接下来跟着实例了解了解如何在Android使用MVP模式:

效果图:


文件结构:

(一)Model

实体类:

package com.example.administrator.mvp.bean;public class User {private String username;private String password;public String getUsername(){return username;}public String getPassword(){return password;}public void setUsername(String username){this.username = username;}public void setPassword(String password){this.password = password;}
}
package com.example.administrator.mvp.biz;public interface IUserBiz {public void login(String username,String password,OnLoginListener loginListener);
}
package com.example.administrator.mvp.biz;import com.example.administrator.mvp.bean.User;public interface OnLoginListener {public void loginSuccess(User user);public void loginFailed();
}
package com.example.administrator.mvp.biz;import com.example.administrator.mvp.bean.User;public class UserBiz implements IUserBiz{@Overridepublic void login(final String username,final String password,final OnLoginListener loginListener){//模拟子线程耗时操作new Thread(){@Overridepublic void run(){try{Thread.sleep(2000);} catch (InterruptedException e){e.printStackTrace();}//模拟登录成功if ("wxh".equals(username) && "123".equals(password)){User user = new User();user.setUsername(username);user.setPassword(password);loginListener.loginSuccess(user);} else{loginListener.loginFailed();}}}.start();}
}
(二)Presenter
package com.example.administrator.mvp.presenter;import android.os.Handler;import com.example.administrator.mvp.bean.User;
import com.example.administrator.mvp.biz.IUserBiz;
import com.example.administrator.mvp.biz.OnLoginListener;
import com.example.administrator.mvp.biz.UserBiz;
import com.example.administrator.mvp.view.IUserLoginView;public class UserLoginPresenter {private IUserBiz userBiz;private IUserLoginView userLoginView;private Handler mHandler = new Handler();public UserLoginPresenter(IUserLoginView userLoginView){this.userLoginView = userLoginView;this.userBiz = new UserBiz();}public void login(){userLoginView.showLoading();userBiz.login(userLoginView.getUserName(), userLoginView.getPassword(), new OnLoginListener(){@Overridepublic void loginSuccess(final User user){//需要在UI线程执行mHandler.post(new Runnable(){@Overridepublic void run(){userLoginView.toMainActivity(user);userLoginView.hideLoading();}});}@Overridepublic void loginFailed(){//需要在UI线程执行mHandler.post(new Runnable(){@Overridepublic void run(){userLoginView.showFailedError();userLoginView.hideLoading();}});}});}public void clear(){userLoginView.clearUserName();userLoginView.clearPassword();}}
(三)View
package com.example.administrator.mvp.view;
import com.example.administrator.mvp.bean.User;public interface IUserLoginView {public String getUserName();public String getPassword();public void clearUserName();public void clearPassword();public void showLoading();public void hideLoading();public  void toMainActivity(User user);public void showFailedError();
}
package com.example.administrator.mvp.view;import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;import com.example.administrator.mvp.R;
import com.example.administrator.mvp.bean.User;
import com.example.administrator.mvp.presenter.UserLoginPresenter;public class UserLoginActivity extends AppCompatActivity implements IUserLoginView{private EditText mEtUsername,mEtPassword;private Button mBtnLogin,mBtnClear;private ProgressBar mPbLoading;private UserLoginPresenter mUserLoginPresenter = new UserLoginPresenter(this);@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_user_login);initViews();}private void initViews(){mEtUsername = (EditText) findViewById(R.id.username);mEtPassword = (EditText) findViewById(R.id.password);mBtnClear = (Button) findViewById(R.id.clear);mBtnLogin = (Button) findViewById(R.id.login);mPbLoading = (ProgressBar) findViewById(R.id.loading);mBtnLogin.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View v){mUserLoginPresenter.login();}});mBtnClear.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View v){mUserLoginPresenter.clear();}});}@Overridepublic String getUserName(){return mEtUsername.getText().toString();}@Overridepublic String getPassword(){return mEtPassword.getText().toString();}@Overridepublic void clearUserName(){mEtUsername.setText("");}@Overridepublic void clearPassword(){mEtPassword.setText("");}@Overridepublic void showLoading(){mPbLoading.setVisibility(View.VISIBLE);}@Overridepublic void hideLoading(){mPbLoading.setVisibility(View.GONE);}@Overridepublic void toMainActivity(User user){Toast.makeText(this, user.getUsername() +" login success , to MainActivity", Toast.LENGTH_SHORT).show();}@Overridepublic void showFailedError(){Toast.makeText(this,"login failed", Toast.LENGTH_SHORT).show();}
}

参考博客

本文标签: 用MVP模式构建Android代码