Android开发模式——————MVP——————用户登录简单的MVP模式


MVP VS MVC

废话少说上图

这里写图片描述

这里写图片描述

优点

  • 降低耦合度,model和View正真分离。修改view不影响Modle
  • 模块职责划分明显,层次清晰
  • 隐藏数据
  • Presenter可以复用,用于多个view而不需改变Presenter的逻辑(当然在view的改动不影响业务逻辑的前提下)
  • 易于单元测试
  • 代码灵活性

实现功能

我们参照弘扬大神的列子请看效果图

这里写图片描述

项目结构

这里写图片描述

涉猎开始

实体类

User类包含用户名,密码两属性,添加set,get方法

IUserBiz

package com.daqsoft.baseproject.mvp.main.act.mvpdesion.biz;
/**
 * Created by yanbo on 2017/5/2.
 * 业务逻辑的接口
 */
public interface IUserBiz {
    public void login(String username,String pass,OnLoginListener loginListener);
}

OnLoginListener

package com.daqsoft.baseproject.mvp.main.act.mvpdesion.biz;

import com.daqsoft.baseproject.mvp.main.act.mvpdesion.bean.Users;
/**
 * Created by yanbo on 2017/5/2.
 * 登陆业务逻辑的接口
 */
public interface OnLoginListener {
    void loginSuccess(Users users);
    void loginFailed();
}

UserBiz

package com.daqsoft.baseproject.mvp.main.act.mvpdesion.biz;

import com.daqsoft.baseproject.mvp.main.act.mvpdesion.bean.Users;

/**
 * Created by yanbo on 2017/5/2.
 * 业务逻辑类
 */

public class UserBiz implements IUserBiz {
    @Override
    public void login(final String username, final String pass, final OnLoginListener loginListener) {
        //模拟子线程耗时操作
        new Thread() {
            @Override
            public void run() {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //模拟登陆成功
                if ("123".equals(username) && "123".equals(pass)){
                    Users users = new Users(username,pass);
                    loginListener.loginSuccess(users);
                }else {
                    loginListener.loginFailed();
                }
            }
        }.start();
    }
}

UserLoginPresenter

package com.daqsoft.baseproject.mvp.main.act.mvpdesion.presenter;

import android.os.Handler;

import com.daqsoft.baseproject.mvp.main.act.mvpdesion.bean.Users;
import com.daqsoft.baseproject.mvp.main.act.mvpdesion.biz.IUserBiz;
import com.daqsoft.baseproject.mvp.main.act.mvpdesion.biz.OnLoginListener;
import com.daqsoft.baseproject.mvp.main.act.mvpdesion.biz.UserBiz;
import com.daqsoft.baseproject.mvp.main.act.mvpdesion.view.IUserLoginView;

/**
 * Created by yanbo on 2017/5/2.
 * 交互桥梁
 */

public class UserLoginPresenter {
    //建立v m实例
    private IUserBiz mUserBiz;
    private IUserLoginView mLoginView;
    private Handler mHandler = new Handler();

    public UserLoginPresenter(IUserLoginView loginView) {
        this.mLoginView = loginView;
        this.mUserBiz = new UserBiz();
    }

    public void login(){
        mLoginView.showLoading();
        mUserBiz.login(mLoginView.getUsername(), mLoginView.getPassword(), new OnLoginListener() {
            @Override
            public void loginSuccess(final Users users) {
                //需要在UI线程中执行
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        mLoginView.toMainActivity(users);
                        mLoginView.hideLoading();
                    }
                });
            }

            @Override
            public void loginFailed() {
                //需要在UI线程中执行
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        mLoginView.showFailedError();
                        mLoginView.hideLoading();
                    }
                });
            }
        });
    }

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

}

IUserLoginView

package com.daqsoft.baseproject.mvp.main.act.mvpdesion.view;

import com.daqsoft.baseproject.mvp.main.act.mvpdesion.bean.Users;

/**
 * Created by yanbo on 2017/5/2.
 * view层的视图接口
 * 有界面看出有两个按钮  登陆  清除
 *
 */

public interface IUserLoginView {
    //login说明要有用户名密码
    String getUsername();
    String getPassword();

    //进度条
    void showLoading();
    void hideLoading();
    //成功(跳转)失败提示
    void toMainActivity(Users users);
    void showFailedError();
    //清除
    void clearUserName();
    void clearPassword();
}

MvpActivity

package com.daqsoft.baseproject.mvp.main.act.mvpdesion;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;

import com.daqsoft.baseproject.R;
import com.daqsoft.baseproject.base.BaseActivity;
import com.daqsoft.baseproject.mvp.main.act.mvpdesion.bean.Users;
import com.daqsoft.baseproject.mvp.main.act.mvpdesion.presenter.UserLoginPresenter;
import com.daqsoft.baseproject.mvp.main.act.mvpdesion.view.IUserLoginView;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

//本类介绍mvp开发技巧
public class MvpActivity extends BaseActivity implements IUserLoginView {

    @BindView(R.id.activity_mvp_et_username)
    EditText mEtUsername;
    @BindView(R.id.activity_mvp_et_pass)
    EditText mEtPass;
    @BindView(R.id.activity_mvp_btn_loggin)
    Button mBtnLoggin;
    @BindView(R.id.activity_mvp_btn_clear)
    Button mBtnClear;
    @BindView(R.id.activity_mvp_progressbar)
    ProgressBar mProgressbar;

    //首先建立交互桥梁
    private UserLoginPresenter mPresenter = new UserLoginPresenter(this);


    @Override
    public int getContentViewResId() {
        return R.layout.activity_mvp;
    }

    @Override
    public void init(Bundle savedInstanceState) {

    }

    @Override
    public void initToolBar() {

    }

    @Override
    public void setListener() {

    }

    @Override
    public void initData() {

    }

    @Override
    public void getData() {

    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // TODO: add setContentView(...) invocation
        ButterKnife.bind(this);
    }

    @OnClick({R.id.activity_mvp_btn_loggin, R.id.activity_mvp_btn_clear})
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.activity_mvp_btn_loggin://登陆
                mPresenter.login();
                break;
            case R.id.activity_mvp_btn_clear://清除
                mPresenter.clear();
                break;
        }
    }

    @Override
    public String getUsername() {
        return mEtUsername.getText().toString();
    }

    @Override
    public String getPassword() {
        return mEtPass.getText().toString();
    }

    @Override
    public void showLoading() {
        mProgressbar.setVisibility(View.VISIBLE);

    }

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

    @Override
    public void toMainActivity(Users users) {

        Toast.makeText(this, users.getUsername() +
                "恭喜登陆成功", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void showFailedError() {
        Toast.makeText(this,
                "登陆失败", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void clearUserName() {
        mEtUsername.setText("");
    }

    @Override
    public void clearPassword() {
        mEtPass.setText("");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值