Android 开发模式MVP模式简单运用

最近试着了解了一下流行的android开发模式,学习一下MVP模式的,mvp模式是更符合android开发的一种基于mvc模式的改进的模式,将actvity或者fragment中的一些逻辑操作封装为接口操作,再通过presenter来进行事件的逻辑处理。

M:即传统的model类,这些操作基本与传统的model方法一样。

V:即view层,主要是actvity和fragment

P:即presenter层,主要是对view层中的业务进行接口封装处理


mvp模式能够使整个项目的接口更清晰,功能模块更明确,代码更清晰:


试着用一个登陆模块来用mvp的模式来写:



model部分主要就是数据的获取与处理.view就是视图的展示,presnter就是业务逻辑操作

model层与传统的一样:

public class UserInfo implements Serializable{

    String username;
    String passowrd;

    public UserInfo(String username, String passowrd) {
        this.username = username;
        this.passowrd = passowrd;
    }

    public UserInfo() {
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassowrd() {
        return passowrd;
    }

    public void setPassowrd(String passowrd) {
        this.passowrd = passowrd;
    }
}
 接下来是数据的获取与请求


public interface IUserManager {

    UserInfo loadCurrentUserInfo();
    void login(String username,String password,RequestDataCallback callback);
}


public interface RequestDataCallback {

    void  onSuccess();

    void  onFailure(String msg);
}


public class UserManager implements IUserManager {

    protected static UserManager mInstance;

    protected UserInfo mCurrentUserInfo;

    public static UserManager getmInstance() {
        if (mInstance == null) {
            synchronized (UserManager.class) {
                if (mInstance == null)
                    mInstance = new UserManager();
            }

        }
        return mInstance;
    }

    @Override
    public UserInfo loadCurrentUserInfo() {
        return mCurrentUserInfo;
    }

    @Override
    public void login(final String username, final String password, final RequestDataCallback callback) {

        new Thread(new Runnable() {
            @Override
            public void run() {

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                if (username.equals("123") && password.equals("123")) {
                    if (callback != null) {
                        mCurrentUserInfo = new UserInfo(username, password);
                        callback.onSuccess();
                    }
                } else {
                    if (callback != null) {
                        callback.onFailure("信息出错!");
                    }
                }
            }
        }).start();

    }
}

接下来写view层.,将所有涉及到的ui操作都封装成接口

public interface ILoginView {

    void initViews();

    String getUsername();

    String getPassword();

    void showProgress();

    void hideProgress();

    void toMainActivity(UserInfo info);

    void loginFailure(String msg);

    void clearUsername();

    void clearPassword();
}
然后在activity中实现接口

public class LoginActivity extends Activity implements ILoginView ,View.OnClickListener{

    protected EditText mUserNameEt, mPasswordt;
    protected Button mLoginBtn, mClearBtn;
    protected ProgressBar mProgressbar;
    protected LoginPresenter mPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        initViews();
    }

    @Override
    public void initViews() {
        mUserNameEt = (EditText) findViewById(R.id.et_login_username);
        mPasswordt = (EditText) findViewById(R.id.et_login_password);
        mLoginBtn = (Button) findViewById(R.id.btn_login);
        mClearBtn = (Button) findViewById(R.id.btn_clear);
        mProgressbar = (ProgressBar) findViewById(R.id.pb_login);
        mLoginBtn.setOnClickListener(this);
        mClearBtn.setOnClickListener(this);
        mPresenter=new LoginPresenter(this);
    }

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

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

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

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

    @Override
    public void toMainActivity(UserInfo info) {
        startActivity(new Intent(LoginActivity.this, MainActivity.class).putExtra("USER_INFO", info));
    }

    @Override
    public void loginFailure(String msg) {
        Toast.makeText(LoginActivity.this, msg, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void clearUsername() {
        mUserNameEt.setText("");
    }

    @Override
    public void clearPassword() {
        mPasswordt.setText("");
    }

    @Override
    public void onClick(View view) {
        switch (view.getId())
        {
            case R.id.btn_login:
                mPresenter.login();
                break;
            case R.id.btn_clear:
                mPresenter.clear();
                break;
            default:
                break;
        }
    }
}

最后,在presenter中实现涉及到的逻辑操作封装接口并实现
public interface ILoginPresenter {

    void login();

    void clear();
}

public class LoginPresenter implements ILoginPresenter{

    protected ILoginView mLoginView;
    protected Handler handler=new Handler();

    public LoginPresenter(ILoginView mLoginView) {
        this.mLoginView = mLoginView;
    }


    @Override
    public void login() {
        mLoginView.showProgress();


        /**
         * 在异步任务中更新ui
         */
        UserManager.getmInstance().login(mLoginView.getUsername(), mLoginView.getPassword(), new RequestDataCallback() {

            @Override
            public void onSuccess() {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        mLoginView.hideProgress();
                        mLoginView.toMainActivity(UserManager.getmInstance().loadCurrentUserInfo());
                    }
                });
            }

            @Override
            public void onFailure(final String msg) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        mLoginView.hideProgress();
                        mLoginView.loginFailure(msg);
                    }
                });

            }
        });
    }

    /*
    在ui线程中更新ui
     */
    @Override
    public void clear() {
        mLoginView.clearPassword();
        mLoginView.clearUsername();
    }
}

好了,整个模块就写完了,现在看一下整个接口,是不是条理更清晰,结构更分明了呢?

详细的研究,之后有时间会追加上来,关键就是利用接口封装逻辑操作,从而使项目可读性更强


本项目已经上传到github,具体地址为https://github.com/nickming/AndroidMVPDemo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值