您的位置:首页 > 其它

根据MVP项目设计模式模拟的登录功能

2016-11-01 10:23 375 查看
  随着工作中的学习,发现从前在一个activity里写一千多行代码简直太low了。这样查找不方便的同时对解耦也是很不友好,经过网上的几遍文章总结,MVC、MVP都是一种设计项目的模式,MVP更适合android的开发,有效的解耦同时把activity的功能单一化只是负责view的展示,其他的逻辑和数据都通过model和presenter来处理,主要是面向接口的编程,这样便于扩展和后期维护。下面随意模仿了MVP模式写了一个简单的登录demo。

我们先来看一下项目结构



 如果想用MVP来写项目的同学一定要多每个需求模块有很清晰的思路,虽然代码有些绕来绕去,但是结构很清晰。例如登陆的话就需要用户名和密码,实体类就好写了。

public class User {

private String name;
private String password;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}
}


说到登录就少不了login和请求,下面是两个操作的接口

public interface IUserModel {

public void login(String username,String password,OnLoginListener loginListener);
}


public interface OnLoginListener {

void LoginSuccess(User user);
void LoginFailed();
}


请求就一定包括成功和失败

登录自然少不了用户名和密码,接下来我们在model里建一个处理登录业务

public class UserModel implements IUserModel {
@Override
public void login(final String username, final String password, final OnLoginListener loginListener) {

new Thread(new Runnable() { //模拟登陆
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if("wzh".equals(username) && "123".equals(password)){
User user=new User();
user.setName(username);
user.setPassword(password);
loginListener.LoginSuccess(user);
}else{
loginListener.LoginFailed();
}
}
}).start();
}
}


睡眠线程2秒实现模拟登陆情景,用户名和密码都是写死的。接下来就要想登录里都有哪些业务要在view中处理了

public interface IUserLoginView {

String getUserName();
String getpassword();
void clearUserName();
void clearPassword();
void showLoading();
void hideLoading();
void toMainActivity();
void showFailedError();
}


根据常见登录总结了几点,获取用户名密码肯定要有,清除也要有,显示隐藏登录中的加载进度,首页的跳转,登录失败的返回结果。接下来就是
4000
主要的presenter中的处理了,在这个包下的类都是为了把model和view 之间搭建桥梁用的

public class UserLoginPresenter {

private IUserModel iUserModel;
private IUserLoginView iUserLoginView;
private Handler handler=new Handler();

public UserLoginPresenter(IUserLoginView iUserLoginView) {
this.iUserLoginView = iUserLoginView;
this.iUserModel=new UserModel();
}

public void login(){
iUserLoginView.showLoading();
iUserModel.login(iUserLoginView.getUserName(), iUserLoginView.getpassword(), new OnLoginListener() {
@Override
public void LoginSuccess(User user) {
handler.post(new Runnable() {
@Override
public void run() {
iUserLoginView.toMainActivity();
iUserLoginView.hideLoading();
}
});
}

@Override
public void LoginFailed() {
handler.post(new Runnable() {
@Override
public void run() {
iUserLoginView.showFailedError();
iUserLoginView.hideLoading();
}
});
}
});
}

public void clear(){
iUserLoginView.clearUserName();
iUserLoginView.clearPassword();
}
}

实现了自身的单例,将登陆和清除的逻辑处理整合到一起。最后view就是activity了

public class MainActivity extends AppCompatActivity implements View.OnClickListener,IUserLoginView{

private EditText name,password;
private Button login,clear;
private ProgressBar mProgressBar;
private UserLoginPresenter userLoginPresenter=new UserLoginPresenter(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

initView();
}

private void initView() {

name= (EditText) findViewById(R.id.name);
password= (EditText) findViewById(R.id.password);
login= (Button) findViewById(R.id.login);
clear= (Button) findViewById(R.id.clear);
mProgressBar= (ProgressBar) findViewById(R.id.loading);
name.setOnClickListener(this);
password.setOnClickListener(this);
login.setOnClickListener(this);
clear.setOnClickListener(this);
}

@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.login:

userLoginPresenter.login();

break;
case R.id.clear:
userLoginPresenter.clear();
break;
}
}

@Override
public String getUserName() {
return name.getText().toString();
}

@Override
public String getpassword() {
return password.getText().toString();
}

@Override
public void clearUserName() {

name.setText("");
}

@Override
public void clearPassword() {

password.setText("");
}

@Override
public void showLoading() {

mProgressBar.setVisibility(View.VISIBLE);
}

@Override
public void hideLoading() {
mProgressBar.setVisibility(View.GONE);
}

@Override
public void toMainActivity() {
Toast.makeText(getApplicationContext(),"跳转首页",Toast.LENGTH_SHORT).show();
}

@Override
public void showFailedError() {

Toast.makeText(getApplicationContext(),"登陆失败",Toast.LENGTH_SHORT).show();
}
}

 主要就是实现Model的业务处理接口,通过presenter 的传递,最后view只需要把数据显示出来就可以了

写的一般仅供各位同僚学习,谢谢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: