閑來無事在家偶然翻到了之前整理的文檔和面試要做到準備路線,雖然內(nèi)容有點多,但是技多不壓身,多多益善
站在用戶的角度思考問題,與客戶深入溝通,找到岳池網(wǎng)站設計與岳池網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設計與互聯(lián)網(wǎng)技術結合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站設計、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、主機域名、網(wǎng)站空間、企業(yè)郵箱。業(yè)務覆蓋岳池地區(qū)。
本部分內(nèi)容是關于Android進階的一些知識總結,涉及到的知識點比較雜,不過都 是面試中幾乎常問的知識點,也是加分的點。 關于這部分內(nèi)容,可能需要有一些具體的項目實踐。在面試的過程中,結合具體自 身實踐經(jīng)歷,才能更加深入透徹的描繪出來
相關內(nèi)容后續(xù)GitHub更新,想沖擊金三銀四的小伙伴可以找找看看,歡迎star
(順手留下GitHub鏈接,需要獲取相關面試等內(nèi)容的可以自己去找)
https://github.com/xiangjiana/Android-MS
(VX:mm14525201314)
MVP,MVC,MVVM
此處延伸:手寫 mvp 例子,與 mvc 之間的區(qū)別,mvp 的優(yōu)勢
MVP 模式,對應著 Model--業(yè)務邏輯和實體模型,view--對應著 activity,負責 View 的繪制以 及與用戶交互,Presenter--負責 View 和 Model 之間的交互,MVP 模式是在 MVC 模式的基礎上, 將 Model 與 View 徹底分離使得項目的耦合性更低,在 Mvc 中項目中的 activity 對應著 mvc 中的 C--Controllor,而項目中的邏輯處理都是在這個 C 中處理,同時 View 與 Model 之間的交 互,也是也就是說,mvc 中所有的邏輯交互和用戶交互,都是放在 Controllor 中,也就是 activity 中。View 和 model 是可以直接通信的。而 MVP 模式則是分離的更加徹底,分工更加明確 Model--業(yè)務邏輯和實體模型,view--負責與用戶交互,Presenter 負責完成 View 于 Model 間的交互,MVP 和 MVC 最大的區(qū)別是 MVC中是允許 Model 和 View 進行交互的,而 MVP 中很明顯,Model 與 View 之間的交互由 Presenter 完成。還有一點就是 Presenter 與 View 之 間的交互是通過接口的
MVP,全稱 Model-View-Presenter即模型-視圖-層現(xiàn)器。
提到MVP,就必須要先介紹一下它的前輩MVC,因為MVP正是基于MVC的基礎發(fā) 展而來的。兩個之間的關系也是源遠流長。MVC,全稱Model-View-Controller,即模型-視圖-控制器。 具體如下:View:對應于布局文件Model:業(yè)務邏輯和實體模型Controllor:對應于Activity
但是View對應于布局文件,其實能做的事情特別少,實際上關于該布局文件中的數(shù) 據(jù)綁定的操作,事件處理的代碼都在Activity中,造成了Activity既像View又像 Controller,使得Activity變得臃腫。
而當將架構改為MVP以后,Presenter的出現(xiàn),將Actvity視為View層,Presenter負 責完成View層與Model層的交互。
現(xiàn)在是這樣的:View對應于Activity,負責View的繪制以及與用戶交互 Model 依然是業(yè)務邏輯和實體模型 Presenter 負責完成View于Model間的交互 下面兩幅圖通過數(shù)據(jù)與視圖之間的交互清楚地展示了這種變化:
MVC模式下實際上就是Activty與Model之間交互,View完全獨立出來了。
MVP模式通過Presenter實現(xiàn)數(shù)據(jù)和視圖之間的交互,簡化了Activity的職責。同時 即避免了View和Model的直接聯(lián)系,又通過Presenter實現(xiàn)兩者之間的溝通。
總結:MVP模式減少了Activity的職責,簡化了Activity中的代碼,將復雜的邏輯代 碼提取到了Presenter中進行處理,模塊職責劃分明顯,層次清晰。與之對應的好 處就是,耦合度更低,更方便的進行測試。
MVC和MVP的區(qū)別
MVC中是允許Model和View進行交互的,而MVP中很明顯,Model與View之間的 交互由Presenter完成。還有一點就是Presenter與View之間的交互是通過接口 的。
還有一點注意:MVC中V對應的是布局文件,MVP中V對應的是Activity。
大多數(shù)MVP模式的示例都使用登錄案例進行介紹。因為簡單方便,同時能提現(xiàn)出 MVP的特點。今天我們也以此例進行學習。 使用MVP的好處之一就是模塊職責劃 分明顯,層次清晰。 該例的結構圖即可展現(xiàn)此優(yōu)點。
在本例中,M0del層負責對從登錄頁面獲取地帳號密碼進行驗證(一般需要請求服 務器進行驗證,本例直接模擬這一過程)。 從上圖的包結構圖中可以看出,Model 層包含內(nèi)容:
①實體類bean
②接口,表示Model層所要執(zhí)行的業(yè)務邏輯
③接口實現(xiàn)類,具體實現(xiàn)業(yè)務邏輯,包含的一些主要方法
下面以代碼的形式一一展開。
①實體類bean
public class User {
private String password;
private String username;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String toString() {
return "User{" +
"password='" + password + '\'' +
", username='" + username + '\'' +
'}';
}
}封裝了用戶名、密碼,方便數(shù)據(jù)傳遞。
②接口
public interface LoginModel {
void login(User user, OnLoginFinishedListener listener);
}其中OnLoginFinishedListener 是presenter層的接口,方便實現(xiàn)回調(diào)presenter,通知presenter業(yè)務邏輯的返回結果,具體在presenter層介紹。
③接口實現(xiàn)類
public class LoginModelImpl implements LoginModel {
@Override
public void login(User user, final OnLoginFinishedListener l istener) {
final String username = user.getUsername();
final String password = user.getPassword();
new Handler().postDelayed(new Runnable() {
@Override public void run() {
boolean error = false;
if (TextUtils.isEmpty(username)){
listener.onUsernameError();//model層里面回調(diào)li stener
error = true;
}
if (TextUtils.isEmpty(password)){
listener.onPasswordError();
error = true;
}
if (!error){
listener.onSuccess();
}
}
}, 2000);
}
}實現(xiàn)Model層邏輯:延時模擬登陸(2s),如果用戶名或者密碼為空則登陸失敗, 否則登陸成功。
視圖:將Modle層請求的數(shù)據(jù)呈現(xiàn)給用戶。一般的視圖都只是包含用戶界面(UI),而 不包含界面邏輯,界面邏輯由Presenter來實現(xiàn)。
從上圖的包結構圖中可以看出,View包含內(nèi)容:
①接口,上面我們說過Presenter與View交互是通過接口。其中接口中方法的定義是 根據(jù)Activity用戶交互需要展示的控件確定的。
②接口實現(xiàn)類,將上述定義的接口中的方法在Activity中對應實現(xiàn)具體操作。
下面以代碼的形式一一展開。
①接口
public interface LoginView {
//login是個耗時操作,我們需要給用戶一個友好的提示,一般就是操作Progre ssBarvoid showProgress();
void hideProgress();
//login當然存在登錄成功與失敗的處理,失敗給出提示 void setUsernameError();
void setPasswordError();
//login成功,也給個提示
void showSuccess();
}上述5個方法都是presenter根據(jù)model層返回結果需要view執(zhí)行的對應的操作。
②接口實現(xiàn)類
即對應的登錄的Activity,需要實現(xiàn)LoginView接口。
public class LoginActivity extends AppCompatActivity implements LoginView, View.OnClickListener {
private ProgressBar progressBar;
private EditText username;
private EditText password;
private LoginPresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
progressBar = (ProgressBar) findViewById(R.id.progress);
username = (EditText) findViewById(R.id.username);
password = (EditText) findViewById(R.id.password);
findViewById(R.id.button).setOnClickListener(this);
//創(chuàng)建一個presenter對象,當點擊登錄按鈕時,讓presenter去調(diào)用mode l層的login()方法,驗證帳號密碼
presenter = new LoginPresenterImpl(this);
}
@Override
protected void onDestroy() {
presenter.onDestroy();
super.onDestroy();
}
@Override
public void showProgress() {
progressBar.setVisibility(View.VISIBLE);
}
.....
}View層實現(xiàn)Presenter層需要調(diào)用的控件操作,方便Presenter層根據(jù)Model層返回 的結果進行操作View層進行對應的顯示。
Presenter是用作Model和View之間交互的橋梁。 從上圖的包結構圖中可以看出, Presenter包含內(nèi)容:
①接口,包含Presenter需要進行Model和View之間交互邏輯的接口,以及上面提到 的Model層數(shù)據(jù)請求完成后回調(diào)的接口。
②接口實現(xiàn)類,即實現(xiàn)具體的Presenter類邏輯。
下面以代碼的形式一一展開。
①接口
public interface OnLoginFinishedListener {
void onUsernameError();
void onPasswordError();
void onSuccess();
}當Model層得到請求的結果,需要回調(diào)Presenter層,讓Presenter層調(diào)用View層的 接口方法。
public interface LoginPresenter {
void validateCredentials(User user);
void onDestroy();
}登陸的Presenter 的接口,實現(xiàn)類為LoginPresenterImpl,完成登陸的驗證,以及銷 毀當前view。
②接口實現(xiàn)類
public class LoginPresenterImpl implements LoginPresenter, OnLog inFinishedListener {
private LoginView loginView;
private LoginModel loginModel;
public LoginPresenterImpl(LoginView loginView) {
this.loginView = loginView;
this.loginModel = new LoginModelImpl();
}
@Override
public void validateCredentials(User user) {
if (loginView != null) {
loginView.showProgress();
}
loginModel.login(user, this);
}
@Override
public void onDestroy() {
loginView = null;
}
@Override
public void onUsernameError() {
if (loginView != null) {
loginView.setUsernameError();
....
}由于presenter完成二者的交互,那么肯定需要二者的實現(xiàn)類(通過傳入?yún)?shù),或者 new)。 presenter里面有個OnLoginFinishedListener, 其在Presenter層實現(xiàn),給Model層 回調(diào),更改View層的狀態(tài), 確保 Model層不直接操作View層。
示例展示:
View與Model并不直接交互,而是使用Presenter作為View與Model之間的橋梁。其中Presenter中同時持有View層的Interface的引用以及Model層的引用,而View層持有Presenter層引用。當View層某個界面需要展示某些數(shù)據(jù)的時候,首先會調(diào)用 Presenter層的引用,然后Presenter層會調(diào)用Model層請求數(shù)據(jù),當Model層數(shù)據(jù)加 載成功之后會調(diào)用Presenter層的回調(diào)方法通知Presenter層數(shù)據(jù)加載情況,最后 Presenter層再調(diào)用View層的接口將加載后的數(shù)據(jù)展示給用戶。
相關內(nèi)容后續(xù)GitHub更新,想沖擊金三銀四的小伙伴可以找找看看,歡迎star
(順手留下GitHub鏈接,需要獲取相關面試等內(nèi)容的可以自己去找)
https://github.com/xiangjiana/Android-MS
(VX:mm14525201314)
本文名稱:作為過來人,對于AndroidMVP模式的一些詳解
標題網(wǎng)址:http://www.yijiale78.com/article0/gsojio.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、云服務器、、外貿(mào)網(wǎng)站建設、Google、網(wǎng)站策劃
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)