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

来源:互联网 发布:h618b改端口 编辑:程序博客网 时间:2024/05/01 11:51

  随着工作中的学习,发现从前在一个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();}

根据常见登录总结了几点,获取用户名密码肯定要有,清除也要有,显示隐藏登录中的加载进度,首页的跳转,登录失败的返回结果。接下来就是主要的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只需要把数据显示出来就可以了

写的一般仅供各位同僚学习,谢谢

0 0
原创粉丝点击