1.需求登陆
1.BasePresenter
/** * basePreseter * @author DEV-81 */ public abstract class BasePresenter<V>{ /** * 绑定的view */ private V mvpView; /** * 绑定view,一般在初始化中调用该方法 */ public void attachView(V mvpView) { this.mvpView = mvpView; } /** * 断开view,一般在onDestroy中调用 */ public void detachView() { this.mvpView = null; } /** * 是否与View建立连接 * 每次调用业务请求的时候都要出先调用方法检查是否与View建立连接 */ public boolean isViewAttached(){ return mvpView != null; } /** * 初始化 * */ protected abstract void onStart(); /** * 获取连接的view */ public V getView(){ return mvpView; } }
2.View接口
/** * view接口 * @author DEV-81 * 一般包含两类方法:1.用在实现类中显示ui的,2.presenter更新ui */ public interface LoginView { /** * 当数据请求成功后,调用此接口显示数据 * @param data 数据源 */ void showResult(String data); }
3.preseter实现类
/** * 同时持有model 和view的实例 * @author DEV-81 */ public class LoginPresenter extends BasePresenter<LoginView>{ private LoginModel mLoginModel; public LoginPresenter() { mLoginModel = new LoginModel(); } public void doLogin(String account , String pwd){ mLoginModel.loginApp(account, pwd, new CallBack<String>() { @Override public void onSuccess(String data) { getView().showResult(data); } @Override public void onFailure(String msg) { getView().showResult(msg); } @Override public void onError() { } /** * complete * */ @Override public void onComplete() { } }); } /** * 初始化任务 * */ @Override protected void onStart() { } }
4.model
/** * model * @author DEV-81 */ public class LoginModel { /** * @param account * @param pwd * @param callBack 通过接口将model回调给presenter * * */ public void loginApp(String account, String pwd, CallBack<String> callBack){ if(TextUtils.isEmpty(account)){ callBack.onFailure("账号为空"); return; } if(TextUtils.isEmpty(pwd)){ callBack.onFailure("密码为空"); return; } if ("zhangsan".equals(account)&&"123".equals(pwd)){ callBack.onSuccess("登录成功"); } } }
5.callback
/** * Callback 接口是Model层给Presenter层反馈请求信息的传递载体, * 所以需要在Callback中定义数据请求的各种反馈状态: */ public interface CallBack<T> { /** * 数据请求成功 * @param data 请求到的数据 */ void onSuccess(T data); /** * 使用网络API接口请求方式时,虽然已经请求成功但是由 * 于{@code msg}的原因无法正常返回数据。 */ void onFailure(String msg); /** * 请求数据失败,指在请求网络API接口请求方式时,出现无法联网、 * 缺少权限,内存泄露等原因导致无法连接到请求数据源。 */ void onError(); /** * 当请求数据结束时,无论请求结果是成功,失败或是抛出异常都会执行此方法给用户做处理,通常做网络 * 请求时可以在此处隐藏“正在加载”的等待控件 */ void onComplete(); }
6.activity
public class MainActivity extends AppCompatActivity implements LoginView{ private EditText mEdtAccount; private EditText mEditPwd; private TextView mTvLogin; private LoginPresenter mLoginPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); mLoginPresenter=new LoginPresenter(); mLoginPresenter.attachView(this); } @Override protected void onResume() { super.onResume(); mLoginPresenter.onStart(); } @Override protected void onDestroy() { super.onDestroy(); mLoginPresenter.detachView(); } private void initView() { mEdtAccount=findViewById(R.id.edt_account); mEditPwd=findViewById(R.id.edt_pwd); mTvLogin=findViewById(R.id.tv_login); mTvLogin.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { login(); } private void login() { String pwd = mEditPwd.getText().toString().trim(); String account = mEdtAccount.getText().toString().trim(); mLoginPresenter.doLogin(account,pwd); } }); } @Override public void showResult(String data) { Toast.makeText(this, data, Toast.LENGTH_SHORT).show(); } }