Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android開發架構模式MVP的簡單思考

Android開發架構模式MVP的簡單思考

編輯:關於Android編程

 

 

什麼是MVP?

  • View層主要是用於展示數據並對用戶行為做出反饋。在Android平台上,他可以對應為Activity, Fragment,View或者對話框。
  • Model是數據訪問層,往往是數據庫接口或者服務器的API。
  • Presenter層可以想View層提供來自數據訪問層的數據,除此以外,他也會處理一些後台事務。 也就是說在mvp模式中,view只單純的展示ui,所有的業務邏輯處理放在Presenter中(通過接口與Molde,View)交互。

    MVP的優點,為什麼采用mvp的架構?


    現在開發安卓人員都會遇到這種問題,那就是在一個邏輯非常的復雜的Activity中,代碼量嘗嘗會達到數百甚至上千行,造成了activity既像view,但是某一定意義更像mvc的Controller。最終,你會發現“所有的事物都被連接到了一起” ,這樣的結果就是造就“萬能的對象”。 \

    With MVP


    \

    而MVP與MVC最不同的一點是M與V是不直接關聯的也是就Model與View不存在直接關系,這兩者之間間隔著的是Presenter層,其負責調控View與Model之間的間接交互,MVP的結構圖如下所示,對於這個圖理解即可而不必限於其中的條條框框,畢竟在不同的場景下多少會有些出入的。在Android中很重要的一點就是對UI的操作基本上需要異步進行也就是在MainThread中才能操作UI,所以對View與Model的切斷分離是合理的。此外Presenter與View、Model的交互使用接口定義交互操作可以進一步達到松耦合也可以通過接口更加方便地進行單元測試。

    MVP DEMO


    我這裡簡單演示一個demo。主界面點擊按鈕,顯示model層傳遞過來的數據,工程邏輯很簡單,但是摸雀雖小,五髒俱全。 先看下目錄結構(為了方便,項目結構沒有分包,分包會優雅很多) width=300
    CallBack 是個回調接口,用來標示請求數據Success or Fail; IModel :Model 層的接口 IPresenter : Presenter的接口 IView : ui層的接口(就是你界面有啥功能,然後你的activity實現此接口) Weather Weathering: 兩個java bean 沒什麼說的

    然後我們說下具體的邏輯。既然Presenter是作為中間組件,那麼就有兩個作用:
    1:負責view界面傳遞的功能請求,去Model 層得到數據 2:Persenter得到Model層的數據(一般是通過回調),然後負責把數據傳遞給View(View層得到的數據是相對被動的,是由Presenter傳過來的)
    看下界面需求:點擊button ,TextView顯示model傳遞的數據。 \

    首先編寫針對該界面的IView接口:
    package com.example.luhuanju.myapplication;
    
    /**
     * Created by luhuanju on 15/10/23.
     */
    public interface IView {
        void showProgress();
    
        void hideProgress();
        
        void  showError();
    
        void setWetherInfo(Weather weather);
    }
    

    既然Model是負責請求數據邏輯的,IModel 接口就好寫很多:(可以看到,參數有個回調接口,是Model請求數據Success 後回調給Persenter ,(Persenter需要實現此回調接口),)
    /**
     * Created by luhuanju on 15/10/23.
     */
    public interface IModel {
    
        void getInfo(String id,CallBack callBack);
    
    }
    

    於是,Persenter是這個樣子的:
    /**
     * Created by luhuanju on 15/10/23.
     */
    public class PresenterImpl implements IPresenter,CallBack {
        IView mIView;
        IModel mIModel;
        public PresenterImpl(IView view){
            mIView=view;
            mIModel=new ModelImpl();
        }
        @Override
        public void getInfo(String id) {
            mIModel.getInfo(id,this);
        }
        @Override
        public void onSuccess(Weather info) {
            mIView.setWetherInfo(info);
        }
        @Override
        public void Error() {
        }
    }
    

    Model負責請求相關網絡數據,我這邊直接用假數據代替了~,你可以結合Retrofit更好的實現網絡請求,看下Model:
    /**
     * Created by luhuanju on 15/10/23.
     */
    public class ModelImpl implements  IModel{
    
    
        @Override
        public void getInfo(String cityNO, final CallBack callBack) {
    
            //直接模擬了一些假數據~!
            //正常邏輯下,該處一般是負責請求網絡得到數據的
            WeatherInfo info=new WeatherInfo();
            info.setCity(bei jing);
            info.setCityid(101);
            Weather weather=new Weather();
            weather.setWeatherinfo(info);
            //此處回調,作用就是把該數據負責回調給Presenter~!
            callBack.onSuccess(weather);
        }
    }
    

    Presenter得到Model回調過來的數據後,把通過IView 接口把數據傳遞給View,看下Activity:
    //需要實現IView接口
    public class MainActivity extends Activity implements IView,View.OnClickListener {
        EditText editText;
        Button button;
        TextView textView2;
        TextView textView;
        TextView textView3;
        IPresenter presenter;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            init();
        }
         void init(){
              editText=( EditText)findViewById(R.id.editText);
              button=(Button)findViewById(R.id.button1);
              textView=(TextView)findViewById(R.id.textView);
              textView2=(TextView)findViewById(R.id.textView2);
              textView3=(TextView)findViewById(R.id.textView3);
              button.setOnClickListener(this);
             //實例化Presenter
              presenter=new PresenterImpl(this);
         };
        @Override
        public void showProgress() {
    
        }
        @Override
        public void hideProgress() {
        }
    
        @Override
        public void showError() {
        }
        //接收到Presenter傳過來的數據
        @Override
        public void setWetherInfo(Weather weather) {
            WeatherInfo info=weather.getWeatherinfo();
            textView.setText(info.getCity());
            textView2.setText(info.getCity());
            textView3.setText(info.getCityid());
        }
        @Override
        public void onClick(View view) {
            int id=view.getId();
            switch (id) {
               case R.id.button1:
               presenter.getInfo(editText.getText().toString().trim());
                break;
            }
        }
    }
    
    

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