学习的目标是什么?思想是什么?下面就跟我一起看看吧。
一、view层即就是activity层要做什么?
1、findViewById、获取控件数据getText().toString()、绑定事件,控件显示隐藏、展示进度条、弹出对话框和Toast、以及给控件设置数据和设置颜色变化,界面跳转等。这些都是必须要在activity中做的,没法抽离。
二、Presenter层要干什么?怎样完成的?
1、负责调用view层实现的方法、调用model层处理业务的方法或者调用自身处理业务的方法、使得view层和model层能够交换数据。主要通过维护的ViewInterface的实现activity对象调用实现的方法、调用model层的方法。另外还可以通过入口方法接收activity中的参数,但这样修改起来没有接口获得参数灵活。
三、model层要做什么?能做什么?
1、封装基本数据、封装业务处理逻辑、封装网络请求逻辑、封装数据转换逻辑。
这样做的好处是什么?为什么要这样做?
原因很简单:低耦合高内聚,特别适合多个app同一套登录业务之类的
参数如何传给model层?
1、presenter的构造方法
2、presenter中定义的入口方法
3、利用activity实现的接口,注意activity就是context对象,必须每次都更新view层对象否则activity切换会导致View层对象回调会出现问题。
下面详细看每一种的图解和简单Demo吧!
第一种:特点完全通过接口获取所有数据和设置所有数据
代码实现:
接口定义:
public interface LoginViewInterface {
//获取账号
String getUserName();
//获取密码
String getPassword();
//消息通知
void notifyMessage(String message);
//改变显示的样式
void changeUI();
//展示进度条
void showProgress();
//取消进度条
void dismissProgress();
//跳转至主页的方法
void goActivity();
void onSuccess(ResponseObject resInfo) throws Exception;
}
Persenter定义:
public class LoginPresenter {
public LoginModel loginModel;
public LoginViewInterface loginViewInterface;
public BaseViewInterface baseViewInterface;
public static LoginPresenter presenter;
public static LoginPresenter getInstance(LoginViewInterface loginViewInterface, BaseViewInterface baseViewInterface) {
//每次最好更新loginViewInterface防止activity关闭,持有的对象地址出现问题
presenter = new LoginPresenter(loginViewInterface, baseViewInterface);
return presenter;
}
private LoginPresenter(LoginViewInterface loginViewInterface, BaseViewInterface baseViewInterface) {
this.loginViewInterface = loginViewInterface;
this.baseViewInterface = baseViewInterface;
loginModel = new LoginModel();//处理逻辑的model
}
//这是Presenter入口掉用
public void userLogin("这里可以为presenter传参数,然后传给model层,而不使用接口") {
String isSuccess = loginModel.userLogin(loginViewInterface.getUserName(), loginViewInterface.getPassword());
if(isSuccess){
loginViewInterface.goActiviy();}}}
activity定义
public class Login2Activity extends BaseActivity implements LoginViewInterface
activity中调用:
//这是调用,因为这里用到了BaseActivity所有多传了个参数
LoginPresenter.getInstance(Login2Activity.this,Login2Activity.this).userLogin()
第二种:不同的是很多参数通过Presenter构造方法传参,不太灵活,详细就不写代码了主要修改的是构造方法,需要重载多个构造方法。
第三种:通过改造Presenter和Model,来达到目的,即就是让Model实现ModelInterface接口,然后在Presenter中让接口指向具体model。
代码实现:
model需要实现ModelInterface
public class LoginModel implements LoginModelInterface
Presenter中构造方法:
loginModelInterface = new LoginModel();
第四种:
第五种:这种不同的是吧控制的一部分通过Presenter回调,分到model中,需要在Presenter中增加内部接口,需要在model中业务处理的方法中添加Presenter回调接口这种相对比较繁琐,Presenter仅仅作为桥梁的作用不做任何处理和逻辑。
代码实现:
这是Presenter中定义的回调接口
public interface CallBack {
void onSuccess(String message);
void onFailed(String error);
void changeUI();
void setConnectNetwork();
void goActvity();
void showProgress();
void dismissProgress();
void getResult(String result);
}
接下来不同的是model:
public void userLogin(String userName, String password, LoginPresenter.CallBack callBack)
//这样就可以通过callBack回调Presenter接口中的方法了
Presenter入口方法中调用:
public void userLogin() {
loginModelInterface.userLogin(loginViewInterface.getUserName(), loginViewInterface.getPassword(), new CallBack() {
@Override
public void onSuccess(String message) {
try {
loginViewInterface.onSuccess(resInfo);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onFailed(String error) {
loginViewInterface.notifyMessage(error);
}
@Override
public void changeUI() {
loginViewInterface.changeUI();
}
@Override
public void setConnectNetwork() {
baseViewInterface.setNetConnection();
}
@Override
public void goActvity() {
loginViewInterface.goActivity();
}
@Override
public void showProgress() {
loginViewInterface.showProgress();
}
@Override
public void dismissProgress() {
loginViewInterface.dismissProgress();
}
@Override
public void getResult(String result) {
try {
resInfo = baseViewInterface.getResult(result);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
第六种:将所有业务处理都放在Presenter中,比如网络请求,具体业务处理,这样业务的重用度比较低。
相对的还有很多改变,根据业务的复杂度,业务的可划分度自行划分和分层调用即可。