中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

作為過來人,對于Android MVP模式的一些詳解

發布時間:2020-03-09 02:08:54 來源:網絡 閱讀:341 作者:Android丶VG 欄目:移動開發
前言

閑來無事在家偶然翻到了之前整理的文檔和面試要做到準備路線,雖然內容有點多,但是技多不壓身,多多益善

本部分內容是關于Android進階的一些知識總結,涉及到的知識點比較雜,不過都 是面試中幾乎常問的知識點,也是加分的點。 關于這部分內容,可能需要有一些具體的項目實踐。在面試的過程中,結合具體自 身實踐經歷,才能更加深入透徹的描繪出來
作為過來人,對于Android MVP模式的一些詳解

相關內容后續GitHub更新,想沖擊金三銀四的小伙伴可以找找看看,歡迎star
順手留下GitHub鏈接,需要獲取相關面試等內容的可以自己去找
https://github.com/xiangjiana/Android-MS
(VX:mm14525201314)

MVP,MVC,MVVM
此處延伸:手寫 mvp 例子,與 mvc 之間的區別,mvp 的優勢

MVP 模式,對應著 Model--業務邏輯和實體模型,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--業務邏輯和實體模型,view--負責與用戶交互,Presenter 負責完成 View 于 Model 間的交互,MVP 和 MVC 最大的區別是 MVC中是允許 Model 和 View 進行交互的,而 MVP 中很明顯,Model 與 View 之間的交互由 Presenter 完成。還有一點就是 Presenter 與 View 之 間的交互是通過接口的

一、MVP概述

MVP,全稱 Model-View-Presenter 即模型-視圖-層現器。
提到MVP,就必須要先介紹一下它的前輩MVC,因為MVP正是基于MVC的基礎發 展而來的。兩個之間的關系也是源遠流長。
MVC,全稱Model-View-Controller,即模型-視圖-控制器。 具體如下:
View 對應于布局文件
Model 業務邏輯和實體模型
Controllor 對應于Activity

但是View對應于布局文件,其實能做的事情特別少,實際上關于該布局文件中的數 據綁定的操作,事件處理的代碼都在Activity中,造成了Activity既像View又像 Controller,使得Activity變得臃腫。

而當將架構改為MVP以后,Presenter的出現,將Actvity視為View層,Presenter負 責完成View層與Model層的交互。

現在是這樣的: View對應于Activity,負責View的繪制以及與用戶交互 Model 依然是業務邏輯和實體模型 Presenter 負責完成ViewModel間的交互 下面兩幅圖通過數據與視圖之間的交互清楚地展示了這種變化:
作為過來人,對于Android MVP模式的一些詳解
MVC模式下實際上就是Activty與Model之間交互,View完全獨立出來了。
作為過來人,對于Android MVP模式的一些詳解
MVP模式通過Presenter實現數據和視圖之間的交互,簡化了Activity的職責。同時 即避免了ViewModel的直接聯系,又通過Presenter實現兩者之間的溝通。

總結: MVP模式減少了Activity的職責,簡化了Activity中的代碼,將復雜的邏輯代 碼提取到了Presenter中進行處理,模塊職責劃分明顯,層次清晰。與之對應的好 處就是,耦合度更低,更方便的進行測試。

MVCMVP的區別

作為過來人,對于Android MVP模式的一些詳解
MVC中是允許ModelView進行交互的,而MVP中很明顯,ModelView之間的 交互由Presenter完成。還有一點就是PresenterView之間的交互是通過接口 的。

還有一點注意: MVC中V對應的是布局文件,MVP中V對應的是Activity

二、MVP的簡單使用

大多數MVP模式的示例都使用登錄案例進行介紹。因為簡單方便,同時能提現出 MVP的特點。今天我們也以此例進行學習。 使用MVP的好處之一就是模塊職責劃 分明顯,層次清晰。 該例的結構圖即可展現此優點。
作為過來人,對于Android MVP模式的一些詳解

1.Model層

在本例中,M0del層負責對從登錄頁面獲取地帳號密碼進行驗證(一般需要請求服 務器進行驗證,本例直接模擬這一過程)。 從上圖的包結構圖中可以看出,Model 層包含內容:

①實體類bean
②接口,表示Model層所要執行的業務邏輯
③接口實現類,具體實現業務邏輯,包含的一些主要方法

下面以代碼的形式一一展開。
①實體類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 + '\'' + 
                '}'; 
      }
   }

封裝了用戶名、密碼,方便數據傳遞。
②接口

  public interface LoginModel { 
      void login(User user, OnLoginFinishedListener listener); 
  }

其中OnLoginFinishedListenerpresenter層的接口,方便實現回調presenter,通知presenter業務邏輯的返回結果,具體在presenter層介紹。
③接口實現類

  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層里面回調li stener 
                 error = true;
              }
              if (TextUtils.isEmpty(password)){ 
                 listener.onPasswordError(); 
                 error = true; 
             }
             if (!error){ 
                 listener.onSuccess(); 
             } 
          } 
       }, 2000); 
    }
  }

實現Model層邏輯:延時模擬登陸(2s),如果用戶名或者密碼為空則登陸失敗, 否則登陸成功。

2.View層

視圖:Modle層請求的數據呈現給用戶。一般的視圖都只是包含用戶界面(UI),而 不包含界面邏輯,界面邏輯由Presenter來實現。

從上圖的包結構圖中可以看出,View包含內容:

①接口,上面我們說過Presenter與View交互是通過接口。其中接口中方法的定義是 根據Activity用戶交互需要展示的控件確定的。
②接口實現類,將上述定義的接口中的方法在Activity中對應實現具體操作。

下面以代碼的形式一一展開。
①接口

  public interface LoginView { 
     //login是個耗時操作,我們需要給用戶一個友好的提示,一般就是操作Progre ssBarvoid showProgress(); 
     void hideProgress(); 
    //login當然存在登錄成功與失敗的處理,失敗給出提示 void setUsernameError(); 
     void setPasswordError(); 
    //login成功,也給個提示 
     void showSuccess(); 
  }

上述5個方法都是presenter根據model層返回結果需要view執行的對應的操作。

②接口實現類
即對應的登錄的Activity,需要實現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); 
      //創建一個presenter對象,當點擊登錄按鈕時,讓presenter去調用mode l層的login()方法,驗證帳號密碼
       presenter = new LoginPresenterImpl(this); 
    }
    @Override 
    protected void onDestroy() { 
       presenter.onDestroy(); 
       super.onDestroy();
    }
    @Override 
    public void showProgress() { 
       progressBar.setVisibility(View.VISIBLE); 
    }
    .....
  }

View層實現Presenter層需要調用的控件操作,方便Presenter層根據Model層返回 的結果進行操作View層進行對應的顯示。

3.Presenter層

Presenter是用作ModelView之間交互的橋梁。 從上圖的包結構圖中可以看出, Presenter包含內容:

①接口,包含Presenter需要進行Model和View之間交互邏輯的接口,以及上面提到 的Model層數據請求完成后回調的接口。
②接口實現類,即實現具體的Presenter類邏輯。

下面以代碼的形式一一展開。
①接口

  public interface OnLoginFinishedListener { 
     void onUsernameError(); 
     void onPasswordError(); 
     void onSuccess(); 
  }

Model層得到請求的結果,需要回調Presenter層,讓Presenter層調用View層的 接口方法。

  public interface LoginPresenter { 
     void validateCredentials(User user); 
     void onDestroy(); 
  }

登陸的Presenter 的接口,實現類為LoginPresenterImpl,完成登陸的驗證,以及銷 毀當前view

②接口實現類

  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完成二者的交互,那么肯定需要二者的實現類(通過傳入參數,或者 new)。 presenter里面有個OnLoginFinishedListener, 其在Presenter層實現,給Model層 回調,更改View層的狀態, 確保 Model層不直接操作View層。

示例展示:
作為過來人,對于Android MVP模式的一些詳解

三、總結
MVP模式的整個核心流程:

ViewModel并不直接交互,而是使用Presenter作為ViewModel之間的橋梁。其中Presenter中同時持有View層的Interface的引用以及Model層的引用,而View層持有Presenter層引用。當View層某個界面需要展示某些數據的時候,首先會調用 Presenter層的引用,然后Presenter層會調用Model層請求數據,當Model層數據加 載成功之后會調用Presenter層的回調方法通知Presenter層數據加載情況,最后 Presenter層再調用View層的接口將加載后的數據展示給用戶。
作為過來人,對于Android MVP模式的一些詳解

相關內容后續GitHub更新,想沖擊金三銀四的小伙伴可以找找看看,歡迎star
順手留下GitHub鏈接,需要獲取相關面試等內容的可以自己去找
https://github.com/xiangjiana/Android-MS
(VX:mm14525201314)

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

淳安县| 南京市| 吉木乃县| 嵊州市| 北宁市| 巴林右旗| 岳普湖县| 弥勒县| 夏邑县| 固阳县| 托里县| 武汉市| 柞水县| 慈利县| 阿勒泰市| 宜丰县| 特克斯县| 双鸭山市| 英德市| 三原县| 新郑市| 商洛市| 屏东市| 镇赉县| 瑞丽市| 吴堡县| 迭部县| 德江县| 小金县| 丹江口市| 石渠县| 泰兴市| 宁国市| 邢台市| 荔波县| 荆州市| 尼勒克县| 荣昌县| 西乌珠穆沁旗| 湖州市| 遂平县|