MVP模式实例:登录界面

来源:互联网 发布:欧洲鞋子品牌 知乎 编辑:程序博客网 时间:2024/06/06 07:35

MVP的核心目标是将无关ui操作的逻辑代码从活动中抽离出来,通过一个presenter控制view和数据层的通讯。

以登录页面为例,页面需要得到用户输入的账号和密码,还要处理登录成功和失败时候的ui变化。但是登陆操作,以及判断返回的数据是成功还是失败,这一部分逻辑不需要活动考虑。

为了抽象出视图层的方法并在presenter中进行调用,定义一个接口,将登录成功失败等view的操作作为抽象函数。然后定义presenter类,在构造器参数中传入接口,这样就可以在类中调用view的方法。最后在活动中实现接口,并实例化presenter进行使用即可。

1.接口:

package com.example.one.junguiapplication.view;/** * Created by lenovo on 2016/11/26. */public interface LoginView {    void onUserNameError();    void onPasswordError();    void onStartLogin();    void onLoginSuccess();    void onLoginFailed();}
2.presenter:
package com.example.one.junguiapplication.presenter;import com.example.one.junguiapplication.adapter.EMCallBackAdapter;import com.example.one.junguiapplication.view.LoginView;import com.hyphenate.chat.EMClient;/** * Created by lenovo on 2016/11/26. */public class LoginPresenter {    private LoginView view;    public LoginPresenter(LoginView view){        this.view=view;    }    public void onLogin(String name,String pwd){//还不能做到正确检查        if(name.length()>20||name.length()<3||pwd.length()<3||pwd.length()>20){            view.onUserNameError();        } else {            EMClient.getInstance().login(name,pwd,mEMCallBack);        }    }    private EMCallBackAdapter mEMCallBack = new EMCallBackAdapter() {        @Override        public void onSuccess() {            view.onLoginSuccess();        }        @Override        public void onError(int i, String s) {            view.onLoginFailed();        }    };}
3.活动:
package com.example.one.junguiapplication.ui.activity;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import com.example.one.junguiapplication.R;import com.example.one.junguiapplication.presenter.LoginPresenter;import com.example.one.junguiapplication.view.LoginView;import butterknife.BindView;import butterknife.BindViews;public class LoginActivity extends BaseActivity implements LoginView,View.OnClickListener{    private final String TAG="LoginAcitivity";    private LoginPresenter presenter;    @BindView(R.id.etName)    private EditText etName,etPassword;    private Button btnLogin;    private TextView tvRegister;    @Override    protected void init() {        super.init();        presenter=new LoginPresenter(this);        etName= (EditText) findViewById(R.id.etName);        etPassword= (EditText) findViewById(R.id.etPassword);        btnLogin= (Button) findViewById(R.id.btnLogin);        btnLogin.setOnClickListener(this);        tvRegister= (TextView) findViewById(R.id.tvRegister);        tvRegister.setOnClickListener(this);    }    @Override    public int getLayoutId() {        return R.layout.activity_login;    }    @Override    public void onUserNameError() {        hideDialog();        post(new Runnable() {            @Override            public void run() {                toast("请输入正确格式");            }        });    }    @Override    public void onPasswordError() {    }    @Override    public void onStartLogin() {        //隐藏软键盘,弹出进度条,执行登录操作        hideInputKeyBoard();        showDialog("登陆中.....");        presenter.onLogin(etName.getText().toString(),etPassword.getText().toString());    }    @Override    public void onLoginSuccess() {        hideDialog();        Log.v(TAG,"**************");        post(new Runnable() {            @Override            public void run() {                toast("登录成功啦!");            }        });        startActivity(MainActivity.class,true);    }    @Override    public void onLoginFailed() {        hideDialog();        post(new Runnable() {            @Override            public void run() {                toast("登录失败");            }        });    }    @Override    public void onClick(View view) {        switch (view.getId()){            case R.id.btnLogin:                onStartLogin();                break;            case R.id.tvRegister:                startActivity(RegisterActivity.class,true);                break;        }    }}

0 0
原创粉丝点击