學習的目标是什麼?思想是什麼?下面就跟我一起看看吧。
一、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中,比如網絡請求,具體業務處理,這樣業務的重用度比較低。
相對的還有很多改變,根據業務的複雜度,業務的可劃分度自行劃分和分層調用即可。