MVP模式

2018-02-09  本文已影响0人  抽象语法树

简介

实例

public interface ILoginModel {

    boolean doLogin(String name,String passwrod);

}

其实就是实现一个向远端服务器验证的功能。

public class LoginModel implements ILoginModel{


    @Override
    public boolean doLogin(final String name, final String passwrod) {
        boolean result = false;
        try {
            Thread.sleep(3000);
            result = name.equals(passwrod);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return result;
    }
}

线程睡眠3秒,模拟后台验证的过程。

public interface LoginContract {

    interface LoginView {

        void setPresenter();

        void showLoading();

        void hideLoading();

        void onSuccess();

        void onFail();
    }

    interface LoginPresenter{

        void login(String account, String password);
    }

}

即View需要用的功能是展示加载条,取消加载条,登陆成功的页面显示,登陆失败的页面显示。而Presenter暴露给View的方法则是点击按钮后需要调用的login方法。

public class LoginPresenter implements LoginContract.LoginPresenter {

    LoginContract.LoginView mView;
    ILoginModel mModel;

    public LoginPresenter(LoginContract.LoginView mView) {
        this.mView = mView;
        this.mModel = new LoginModel();
    }

    @Override
    public void login(final String account, final String password) {
        mView.showLoading();
        new Thread(new Runnable() {
            @Override
            public void run() {
                final boolean result = mModel.doLogin(account,password);
                Handler handler = new Handler(Looper.getMainLooper());
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        if (result) {
                            mView.hideLoading();
                            mView.onSuccess();
                        }else {
                            mView.hideLoading();
                            mView.onFail();
                        }
                    }
                });
            }
        }).start();

    }
}

login方法中首先调用View的showLoading()展示加载框,然后新开线程做耗时操作,并通过回调执行对View的其他控制。

public class LoginActivity extends AppCompatActivity implements LoginContract.LoginView{

    private Button mBtLogin;
    private EditText mEtName;
    private EditText mEtPassword;
    private View mLoading;
    LoginContract.LoginPresenter mPresenter;

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

    private void initView() {
        mEtName = (EditText) findViewById(R.id.et_name);
        mEtPassword = (EditText) findViewById(R.id.et_password);
        mBtLogin = (Button) findViewById(R.id.bt_login);
        mLoading = findViewById(R.id.layout_loading);
        mBtLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String name = mEtName.getText().toString();
                String password = mEtPassword.getText().toString();
                mPresenter.login(name,password);
            }
        });
    }

    @Override
    public void setPresenter() {
        mPresenter = new LoginPresenter(this);
    }

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

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

    @Override
    public void onSuccess() {
        Toast.makeText(this,"登陆成功",Toast.LENGTH_SHORT).show();
    }

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

Presenter可通过契约类LoginContract 中View接口定义的方法来对View进行操作。

总结

上一篇 下一篇

猜你喜欢

热点阅读