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;
}
}
}