Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android MVP開發模式詳解(十九)

Android MVP開發模式詳解(十九)

編輯:關於Android編程

 

 

(一).前言:

今天我們的項目繼續更新,今天我們主要講解MVP開發模式以及具體實例。

 

(二).簡介:

MVP(Model ViewPresenter)模式是著名的MVC(Model ViewController)模式的一個演化版本,目前它在Android應用開發中越來越重要了。初看起來我們會感覺增加了很多類接口代碼看起來更加清晰。

MVP模式可以分離顯示層和邏輯層,所以功能接口如何工作與功能的展示可以實現分離,MVP模式理想化地可以實現同一份邏輯代碼搭配不同的顯示界面。不過MVP不是一個結構化的模式,它只是負責顯示層而已,任何時候都可以在自己的項目結構中使用MVP模式。(不局限於Android項目開發)

因為MVP其實就是從MVC模式演化產生的,那麼我們先看一下著名的MVC模式:

  • View:對應於布局文件
  • Model:業務邏輯和實體模型
  • Controller:控制器,Android中對應於Activity

    對應的交互圖如下:

     

    \

    雖然Android系統應用開發本身是遵循MVC開發模式的,但是我們仔細看一下View層和Activity,具體view布局文件中的數據綁定和事件處理的方法代碼都是冗余在Activity中的,所以我們經常看可以看到Activity類動不動就是少則九百行,多則上千甚至幾千行。那麼現在的演化升級版本的MVP的模式又是怎麼樣的呢?MVP模式會引入 Presenter層,該機型復雜完成View層和Model層的交互,那麼具體MVP對應如下:

    • View:View通常來說是由Activity實現的,它會包含一個Presenter的引用,View要做的就只是在每次有接口調用的時候(比如按鈕點擊後)調用Presenter的方法。
    • Model:業務邏輯和實體模型
    • Presenter:主要作為溝通View和Model的橋梁,它從Model層檢索數據後,返回給View層,但是不像MVC結構,因為它也可以決定與View層的交互操作。

      數據交互圖如下:

      \

      觀察上面兩個模式的交互圖,是不是MVP模式更加清晰簡單啊!

      (三).MVC和MVP區別:

      我們來具體看一下下面兩張對比,就可以看來具體區別了:

      \

      觀察上圖我們可以發現MVP模式中,View和Model的交互是通過Presenter來進行完成,這樣統一管理,邏輯會更加清晰。

      (四).MVP模式例子講解:

      4.1.具體實現功能需求:我們是用MVP模式來進行實現用戶登錄操作.

      4.2.例子實例如下:

      \

      4.3.項目代碼框架如下:

      \

      \

      \

      \

      4.4.代碼具體實現:

      4.4.1.Model層:Bean類(Entity),PersonBean類,然後在業務邏輯類中有登錄方法,同時把登錄成功狀態回調接口傳入進入,具體如下:

       

      packagecom.chinaztt.fda.entity;
       
      /**
       * 當前類注釋:用戶信息實體類
       * 項目名:FastDev4Android
       * 包名:com.chinaztt.fda.entity
       * 作者:江清清 on 15/10/27 14:13
       * 郵箱:[email protected]
       * QQ: 781931404
       * 公司:江蘇中天科技軟件技術有限公司
       */
      public classPersonBean {
          private String username;
          private String password;
       
          public PersonBean() {
          }
       
          public PersonBean(String username, Stringpassword) {
              this.username = username;
              this.password = password;
          }
       
          public String getUsername() {
              return username;
          }
       
          public void setUsername(String username) {
              this.username = username;
          }
       
          public String getPassword() {
              return password;
          }
       
          public void setPassword(String password) {
              this.password = password;
          }
       
          @Override
          public String toString() {
              return PersonBean{ +
                      username=' +username + ''' +
                      , password=' +password + ''' +
                      '}';
          }
      }
      public interfaceIPersonBiz {
          void login(String username,Stringpassword,LoginRequestCallBack valueCallBack);
      }
      packagecom.chinaztt.fda.biz.imp;
       
      importcom.chinaztt.fda.biz.IPersonBiz;
      importcom.chinaztt.fda.biz.LoginRequestCallBack;
      importcom.chinaztt.fda.entity.PersonBean;
      importcom.chinaztt.fda.utils.Log;
       
      /**
       * 當前類注釋:用戶相關業務邏輯實現類
       * 項目名:FastDev4Android
       * 包名:com.chinaztt.fda.biz.imp
       * 作者:江清清 on 15/10/27 16:33
       * 郵箱:[email protected]
       * QQ: 781931404
       * 公司:江蘇中天科技軟件技術有限公司
       */
      public classPersonBizImp implements IPersonBiz{
          private static final  String TAG=PersonBizImp;
          @Override
          public void login(final String username,final String password, final LoginRequestCallBack valueCallBack) {
             Log.d(TAG,username:+username+,password:+password);
              new Thread(new Runnable() {
                  @Override
                  public void run() {
                      try {
                          Thread.sleep(4500);
                      } catch (InterruptedExceptione) {
                          e.printStackTrace();
                      }
                      //進行開始登錄,這邊應該進行請求服務器,進行數據驗證
                     if(username.equals(jiangqq)&&password.equals(12345)){
                         valueCallBack.loginSuccess(new PersonBean(username,password));
                      }else{
                         valueCallBack.loginFailed();
                      }
                  }
              }).start();
          }
      }
      
      packagecom.chinaztt.fda.biz;
       
      importcom.chinaztt.fda.entity.PersonBean;
      /**
       * 當前類注釋:登錄請求結果回調
       * 項目名:FastDev4Android
       * 包名:com.chinaztt.fda.biz
       * 作者:江清清 on 15/10/27 19:50
       * 郵箱:[email protected]
       * QQ: 781931404
       * 公司:江蘇中天科技軟件技術有限公司
       */
      public interfaceLoginRequestCallBack {
          //登錄成功回調方法
          void loginSuccess(PersonBean personBean);
          //登錄失敗回調方法
          void loginFailed();
      }

       

      4.4.2.View層:該通過Presenter與View進行交互,這邊需要定義一個接口ILoginView:

       

      packagecom.chinaztt.fda.ui.view;
       
      importcom.chinaztt.fda.entity.PersonBean;
       
      /**
       * 當前類注釋:登錄頁面 相關操作 功能接口
       * 項目名:FastDev4Android
       * 包名:com.chinaztt.fda.ui.view
       * 作者:江清清 on 15/10/27 16:35
       * 郵箱:[email protected]
       * QQ: 781931404
       * 公司:江蘇中天科技軟件技術有限公司
       */
      public interfaceILoginView {
          //獲取用戶名
          String getUserName();
          //獲取密碼
          String getPassword();
        
          void showSuccessInfo(PersonBeanpersonBean);
          void showFailedInfo();
      }

       

      有了上面的接口之後,我們就需要寫我們的實現類Activity了,就非常簡單了

       

      packagecom.chinaztt.fda.test;
       
      importandroid.os.Bundle;
      importandroid.view.View;
      importandroid.widget.Button;
      importandroid.widget.EditText;
       
      importcom.chinaztt.fda.entity.PersonBean;
      importcom.chinaztt.fda.presenter.LoginPresenter;
      importcom.chinaztt.fda.ui.R;
      importcom.chinaztt.fda.ui.base.BaseActivity;
      importcom.chinaztt.fda.ui.view.ILoginView;
      importcom.chinaztt.fda.utils.Log;
       
      importorg.androidannotations.annotations.EActivity;
       
      /**
       * 當前類注釋:MVP開發模式實例
       * 項目名:FastDev4Android
       * 包名:com.chinaztt.fda.test
       * 作者:江清清 on 15/10/27 13:38
       * 郵箱:[email protected]
       * QQ: 781931404
       * 公司:江蘇中天科技軟件技術有限公司
       */
      @EActivity
      public classMVPTestActivity extends BaseActivity implements ILoginView{
          private static  final String TAG=MVPTestActivity;
       
          private EditText ed_username;
          private EditText ed_password;
          private Button btn_login;
          private LoginPresenter mLoginPresenter;
          @Override
          protected void onCreate(BundlesavedInstanceState) {
              super.onCreate(savedInstanceState);
             setContentView(R.layout.mvp_test_layout);
             ed_username=(EditText)this.findViewById(R.id.ed_username);
             ed_password=(EditText)this.findViewById(R.id.ed_password);
             btn_login=(Button)this.findViewById(R.id.btn_login);
              mLoginPresenter=newLoginPresenter(this);
              btn_login.setOnClickListener(newView.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      mLoginPresenter.loginSystem();
       
                  }
              });
          }
          /**
           * 進行返回用戶名信息
           * @return
           */
          @Override
          public String getUserName() {
              returned_username.getText().toString().trim();
          }
          /**
           * 進行返回用戶密碼信息
           * @return
           */
          @Override
          public String getPassword() {
              returned_password.getText().toString().trim();
          }
          /**
           * 登錄成功 回調
           * @param personBean
           */
          @Override
          public void showSuccessInfo(PersonBeanpersonBean) {
             Log.d(TAG,showSuccessInfo:+personBean.toString());
             showToastMsgShort(登錄成功:+personBean.toString());
          }
          /**
           * 登錄失敗 回調
           */
          @Override
          public void showFailedInfo() {
             Log.d(TAG,showFailedInfo...);
             showToastMsgShort(登錄失敗...);
          }
      }

       

      最後還少一個交互橋梁Presenter:

      4.4.3.Presenter層:作為Model和View之間的交互橋梁,在本例中進行執行登錄操作,然後去Model業務中執行登錄,最後把登錄結果信息返回給View層,就是這麼簡單:

       

      packagecom.chinaztt.fda.presenter;
       
      importandroid.os.Handler;
       
      importcom.chinaztt.fda.biz.IPersonBiz;
      importcom.chinaztt.fda.biz.LoginRequestCallBack;
      importcom.chinaztt.fda.biz.imp.PersonBizImp;
      importcom.chinaztt.fda.entity.PersonBean;
      importcom.chinaztt.fda.ui.view.ILoginView;
      importcom.chinaztt.fda.utils.Log;
       
      /**
       * 當前類注釋:負責完成登錄界面View於Model(IPersonBiz)間的交互
       * 項目名:FastDev4Android
       * 包名:com.chinaztt.fda.presenter
       * 作者:江清清 on 15/10/27 16:36
       * 郵箱:[email protected]
       * QQ: 781931404
       * 公司:江蘇中天科技軟件技術有限公司
       */
      public classLoginPresenter {
          private static final  String TAG=LoginPresenter;
          private ILoginView mLoginView;
          private IPersonBiz mPersonBiz;
       
          private Handler mHandler=new Handler();
       
          public LoginPresenter(ILoginView view) {
              mLoginView = view;
              mPersonBiz = new PersonBizImp();
          }
       
          public void loginSystem(){
            mPersonBiz.login(mLoginView.getUserName(), mLoginView.getPassword(), newLoginRequestCallBack() {
                 /**
                  * 登錄成功
                  * @param personBean
                  */
                 @Override
                 public void loginSuccess(finalPersonBean personBean) {
                     Log.d(TAG,登錄成功: + personBean.toString());
                     mHandler.post(new Runnable() {
                         @Override
                         public void run() {
                            mLoginView.showSuccessInfo(personBean);
                         }
                     });
                 }
                 /**
                  * 登錄失敗
                  */
                 @Override
                 public void loginFailed() {
                    Log.d(TAG,登錄失敗...);
                     mHandler.post(new Runnable() {
                         @Override
                         public void run() {
                            mLoginView.showFailedInfo();;
                         }
                     });
                 }
             });
          }
      }

       

      到此我們的MVP模式的例子就大體完成了,看一下上面的效果演示就OK了。

       

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved