Android之MVP(二)深入封装

1 篇文章 0 订阅

为什么要进行MVP的二次深入封装?

这里我是参看了:《如何更高效的使用MVP以及官方MVP架构解析》,通过上面的学习弄了个登录的demo,用于方便理解。

先来看看项目的文件

BasePresenter
如果每一个Activity都需要做绑定和解绑操作就太麻烦了,现在我希望可以有一个通用的presenter来为我们添加view的绑定与销毁。

public abstract class BasePresenter<T> {

    public T mView;

    public void attach(T view) {
        this.mView = view;
    }

    public void dettach() {
        mView = null;
    }
}
因为不能限定死传入的View,所以使用泛型来代替传入的对象。通过这个通用的presenter我就可以把 LoginPresenter 简化成下面的样子。(Presenter主要进行业务逻辑,事件监听的处理,起(M) biz 与 (V层) activity之间的桥梁连接作用

public class LoginPresenter extends BasePresenter<ILoginView> {

    private final LoginBiziml loginBiziml;
    private final Handler handler;

    public LoginPresenter() {
        loginBiziml = new LoginBiziml();
        handler = new Handler();
    }

    public void toDoLogin() {
        String userName = mView.getUserName();
        String passWord = mView.getPassWord();
        if (TextUtils.isEmpty(userName)) {
            mView.showErrorMsg("用户名不能为空");
            return;
        }
        if (TextUtils.isEmpty(passWord)) {
            mView.showErrorMsg("密码不能为空");
            return;
        }
        mView.showLoading();
        User user = new User();
        user.userName = userName;
        user.passWord = passWord;
        loginBiziml.loginApp(user, new OnLoginBizListener() {
            @Override
            public void onLoginSuccess(boolean isSuccess) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        mView.hiddenLoading();
                        mView.showSuccessMsg("登录成功");
                    }
                });

            }

            @Override
            public void onLoginFailed(boolean isSuccess) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        mView.hiddenLoading();
                        mView.showErrorMsg("登录失败");
                    }
                });
            }
        });
    }

    public void clear() {
        mView.clearText();
    }

}
BaseView
界面需要提供的UI方法中会有很多类似的UI方法,可以把它们提取到一个公共的父类接口中。比如提取显示loading界面和隐藏loading界面的方法等等,其他的view层接口就可以直接继承BaseView接口,不必重复的写显示和隐藏loading界面方法。

public interface BaseView {
    void showLoading();
    void hiddenLoading();
    void showSuccessMsg(String msg);
    void showErrorMsg(String msg);
}

BaseActivity
presenter绑定到activity和View的绑定和解绑操作是每个Activity都会去做的,同样这里我也希望能有一个父类来完成这个统一的操作。

public abstract class BaseActivity<V,T extends BasePresenter<V>> extends AppCompatActivity {

    public T presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        presenter = initPresenter();
    }

    @Override
    protected void onResume() {
        super.onResume();
        presenter.attach((V) this);
    }

    @Override
    protected void onDestroy() {
        presenter.dettach();
        super.onDestroy();
    }

    public abstract T initPresenter();
}

同样使用泛型来提取通用的逻辑,presenter的初始化,以及view的绑定和解绑操作都提取到父类Activity中。向外部提供了一个 initPresenter(); 方法用来初始化presenter,如果想创建不同参数的构造函数都可以随意去创建。

LoginActivity(我这里写demo时直接用MainActivity)

public class MainActivity extends BaseActivity<ILoginView, LoginPresenter> implements ILoginView {

    private EditText mEtUsername, mEtPassword;
    private Button mBtnLogin, mBtnClear;
    private ProgressBar mPbLoading;

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

    private void initview() {
        mEtUsername = (EditText) findViewById(R.id.id_et_username);
        mEtPassword = (EditText) findViewById(R.id.id_et_password);
        mBtnClear = (Button) findViewById(R.id.id_btn_clear);
        mBtnLogin = (Button) findViewById(R.id.id_btn_login);
        mPbLoading = (ProgressBar) findViewById(R.id.id_pb_loading);
        mBtnLogin.setOnClickListener(new View.OnClickListener() {

            private User user;

            @Override
            public void onClick(View v) {
                presenter.toDoLogin();
            }
        });
        mBtnClear.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                presenter.clear();
            }
        });
    }

    @Override
    public LoginPresenter initPresenter() {
        return new LoginPresenter();
    }

    @Override
    public void toMain() {

    }

    @Override
    public void clearText() {
        mEtUsername.setText(null);
        mEtPassword.setText(null);
    }

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

    @Override
    public String getPassWord() {
        return mEtPassword.getText().toString().trim();
    }

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

    @Override
    public void hiddenLoading() {
        mPbLoading.setVisibility(View.GONE);
    }

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

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

activity中只做了控件的初始化和展示,有没有代码很简洁感觉,赶紧动手敲敲吧。

Demo


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值