<address id="ttjl9"></address>

      <noframes id="ttjl9"><address id="ttjl9"><nobr id="ttjl9"></nobr></address>
      <form id="ttjl9"></form>
        <em id="ttjl9"><span id="ttjl9"></span></em>
        <address id="ttjl9"></address>

          <noframes id="ttjl9"><form id="ttjl9"></form>

          Android MVP極限封裝(一)

          2018-9-4    seo達人

          如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

          MVP架構在Android這一塊已經盛行依舊,對于一些學習能力比較強的人來說,已經能夠運用自如甚至改造優化了,對于吾等菜鳥,卻是如此的陌生,今日這篇博客,算是小弟在學習和應用上的一點總結罷了,如有不足,還請各位大神不吝指教。

          MVP架構是什么就不多說了,博主主要很大家分享的是,如何設計MVP架構。

          先來分析一下MVP如何使用:M-V-P三層之間,P作為中間層,負責M,V之間的數據交互的中介,將數據從M層獲取,處理之后提交到V層,換句話說,V需要持有P的實例,P層需要持有V的實例。原理很簡單,使用泛型對數據進行封裝處理: 
          1.定義一個V層的空接口,主要是方便封裝:

          /**
           * V層接口
           */ public interface IView { }
                      
          • 1
          • 2
          • 3
          • 4
          • 5

          2.定義一個P層的接口:

          /**
           * 抽象為接口
           * 
           */ public interface IPresenter<V extends IView> { /**
               * 綁定視圖
               * 
               * @param view
               */ void attachView(V view); /**
               * 解除綁定(每個V記得使用完之后解綁,主要是用于防止內存泄漏問題)
               */ void dettachView();
          
          }
                      
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19

          3.封裝P基類:綁定解綁V實例

          /**
           * 抽象類 統一管理View層綁定和解除綁定
           *
           * @param <V>
           */ public class BasePresenter<V extends IView, M extends IModel> implements IPresenter<V> { private WeakReference<V> weakView; protected M model;
          
              public V getView() { return proxyView;
              } /**
               * 用于檢查View是否為空對象
               *
               * @return */ public boolean isAttachView() { return this.weakView != null && this.weakView.get() != null;
              } @Override public void attachView(V view) { this.weakView = new WeakReference<V>(view);
              } @Override public void dettachView() { if (this.weakView != null) { this.weakView.clear(); this.weakView = null;
                  }
              }
          }
                      
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23
          • 24
          • 25
          • 26
          • 27
          • 28
          • 29
          • 30
          • 31
          • 32
          • 33
          • 34
          • 35
          • 36

          4.M層封裝:

          /**
           * M層
           */ public interface IModel { } /**
           * 登錄model
           * Created by admin on 2018/2/5.
           */ public interface ILoginModel extends IModel { void login();
          } /**
           * 登錄
           * Created by admin on 2018/2/5.
           */ public class LoginModel implements ILoginModel { @Override public void login() { // TODO: 2018/2/5 發起登錄請求  }
          }
                      
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23
          • 24
          • 25

          之后,將數據提交到activity或者fragment就行了。 
          最基本的鋪墊已經做好了,接下來就該封裝View了:

          /**
           * Created by admin on 2018/2/5.
           */ public abstract class MvpActivity<V extends IView, P extends BasePresenter<V>> extends AppCompatActivity implements IView { private P presenter;
          
              @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState);
                  ...
                  presenter=getPresenter();
                  presenter.attachView(this);
              } protected P getPresenter() { return presenter;
              } protected void setPresenter(P presenter) { this.presenter = presenter;
              } protected V getView() { return (V) this;
              }
              ...
              @Override protected void onDestroy() {
                  presenter.dettachView();
                  ... super.onDestroy();
              }
          }
                      
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23
          • 24
          • 25
          • 26
          • 27
          • 28
          • 29
          • 30
          • 31
          • 32
          • 33
          • 34
          • 35

          收工,MVP基礎框架搭建完成了。沒錯,就是基礎框架,但是能不能用呢,讓我們拭目以待吧。 
          先來寫一個View:

          public interface ILoginView extends IView { void onLoginSuccess(); void onFailed();
          
          }
                      
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6

          然后是Presneter:

          /**
           * Created by admin on 2018/2/5.
           */ public class LoginPresenter extends BasePresenter<ILogin, LoginModel> { public LoginPresenter() {
                  model = new LoginModel();
              }
          
              public void login(){
                  model.login(new LoginCallBack() { @Override public void onSuccess() { if(null!=(ILogin)getView()){
                              weakView.onLoginSuccess();
                          }
                      } @Override public void onFailure() { if(null!=(ILogin)getView()){
                              weakView.onFailure();
                          }
                      }
                  });
              }
          
          }
                      
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23
          • 24
          • 25
          • 26
          • 27
          • 28

          最后來完成Activity的邏輯:

          public class LoginActivity extends MvpActivity<ILoginView, LoginPresenter> implements ILoginView { ...
              @Override public LoginPresenter getPresenter() { return new LoginPresenter();
              } public void login(View view) {
                  String name = etUserName.getText().toString();
                  String pwd = etUserPwd.getText().toString();
                  getPresenter().login(name, pwd);
              }
          
              @Override public void onLoginSuccess() {
          
              }
          
              @Override public void onFailed(){
          
              ...
          }

          
              



          
              


          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務。


          日歷

          鏈接

          個人資料

          藍藍設計的小編 http://www.syprn.cn

          存檔

          亚洲va欧美va天堂v国产综合