Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 【項目架構】Android MVP 和MVVM框架模式 學習實例Demo之mvp篇

【項目架構】Android MVP 和MVVM框架模式 學習實例Demo之mvp篇

編輯:關於Android編程

隨著移動開發的不斷演進,項目開發設計模式也變的越來越新穎,越來越便捷。而各個團隊都在追求良好的項目架構,不僅能加快工程的進度,也對後續項目的維護和擴展起來很重要的做用。但是,這樣也許就會有人問了,既然架構設計這麼重要,那為什麼不直接設計出來一種萬能的構架,直接用最好的構架不就行了。可是,殊不知項目設計的好壞,並不能完全依賴固化的架構。項目的整個過程,是一個不斷演進的過程,需要不斷的去調整。因為越好的構架設計,邏輯分層是越清楚,代碼耦合度越低,復用性和擴展性更好。然後,這樣的設計,並不是項目一開始就能定型的。

 

現在根據個人經驗,給大家主說項目架構思路,若有不同意見,歡迎留言交流:

初期項目,設計要遵循這兩點:

一,團隊。

二,項目。

團隊:根據團隊的成員人數和能力去劃分。

項目:根據功能的多少和功能的復雜度劃分。

小的項目團隊,采取最簡單的模式。統一協作能加快開發,溝通快捷。

大的項目團隊,則需要有一個好的功能模塊劃分,設計項目中的耦合設計。兩三人為一小組進行模塊開發。充分發揮小團隊高效優勢,完成項目。

任何項目,最重要的問題就是delay。若一出問題就是各種不可控制。所以,一個好的項目經理,不僅僅是會設計出好的項目架構,更重要的是根據團隊的能力,能按時完全產品上線,保證產品的穩定性。這才算是一個合格的項目經理。項目經理要真正的在團隊中說NO。面對老板實時要修改需求說NO,面對團隊有困難不敢面對說NO。控制好產品的正確走向,才是做好事情的根本。

 

好了,閒說扯了一大堆,就不多說了。因為有人問起,所以就隨手寫點了。但說的再多還是實戰的經驗才是最重要的。不同的團隊需要有不一樣的處理方式,這個是沒有模式可言。只有你懂得把控,才是掌握全局。給大家的經驗之談,說的不對歡迎交流!!!

-------------------------------------------------------------------------------------------------------------------------

開始正題:

mvc,相應不用多說,寫程序的同學都懂,也應該都會用。現在就來說說mvp的設計架構。下面的這只是一個很簡單的例子,就是為了讓大家更簡單清晰的看清流程。方便讓那些想學習的同學一看就懂。

先看一個小圖助於理解:

\

記住,團隊項目開發,功能分離。降低耦合。都是要注重接口編程。對外統一接口,對內擴展。外部減少代碼關聯,內部功能清楚。這才是好的要求習慣。

 

好了,繼續;

項目代碼結構圖(是不是特別的簡單):

\

 

小項目就是點擊按鈕,從底層拿到數據,返回!!!特別特別的so easy!!

LoginActivity:登錄頁面。只需要關注與它關聯的LoginPresenter即可。不需要關注底層數據。(當然,若是真實的項目開發,接口是需要統一接口協議和數據模式的!在此就不過多復雜了!)

 

package net.hd.mvpdemo.activity;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

import net.hd.mvpdemo.R;
import net.hd.mvpdemo.presenter.ICallback;
import net.hd.mvpdemo.presenter.LoginPresenter;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

/**
 * UI邏輯:關注UI操作和結果。操作關聯的LoginPresenter及回調接口。
 */
public class LoginActivity extends Activity implements ICallback {
    //順便讓大家學習下butterknife了

    @BindView(R.id.name)
    EditText mNameEt;

    @BindView(R.id.password)
    TextView mPsdTv;

    @BindView(R.id.login_progress)
    View mProgressView;

    private LoginPresenter mPrsenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        ButterKnife.bind(this);
        mPrsenter = new LoginPresenter(this);
    }

    @OnClick(R.id.email_sign_in_button)
    void onSubmit() {
        String obj = mNameEt.getText().toString();
        mPrsenter.operateView(obj);
    }

    /**
     * 向Presenter注冊callback,回調接口
     *
     * @param obj
     */
    @Override
    public void callback(String obj) {
        mPsdTv.setText("密碼:" + obj);
    }


}


花一丟丟時間寫的,比較匆忙,就不管太多美觀和優化了。只是為了讓大家簡單的看明白。

 

 

IMvpView 接口,作View數據分發。(真實的項目開發中有用。小項目用著感覺特別扭!但功能多的時候,不同的UI模式可能需要聯系,而未免直接相互調用,需要定義統一接口方式,功能隔離的好用處啊!!當然,還有個BaseView,進行重復代碼封裝,但此小例子,實在寫著多多余了!)

 

package net.hd.mvpdemo.view;

import android.app.Fragment;

import net.hd.mvpdemo.presenter.IMvpPresenter;

import java.util.Objects;

/**
 * Created by dan on 2016/9/2.
 * 

* 分發接口 */ public interface IMvpView { void operateView(Objects obj); }


IMvpPresenter:P接口。對View接收操作,注冊回調。對Model數據調用,注冊回調。簡單的實在沒話說了!

 

 

package net.hd.mvpdemo.presenter;

import net.hd.mvpdemo.view.IMvpView;

import java.util.Objects;

/**
 * Created by dan on 2016/9/2.
 * presenter接口。對View和Model都應該是展示其接口就成
 */
public interface IMvpPresenter {

    void operateModel(String obj, ICallback back);

}

ICallback:回調接口。此項目作為View和Presenter回調接口。但是實際項目中,不會這麼簡單,不同的功能模塊回調接口必然不一。而且我也是用最簡單的回調方式。真實的情況是不同功能方式不一。比如有些接口是動態注冊監聽回調,有些則需要狀態監聽。這就好比,Android中的listener和broadcast區別。都能回調數據,但應用場景和方法不一樣而已。

 

 

package net.hd.mvpdemo.presenter;

import java.util.Objects;

/**
 * 可以寫一個統一的回調接口。
 * 作用:用於View/presenter。model/presenter之間的回調
 * 這裡只是簡單實現,理解其思路即可,具體接口定義,則根據實際的業務需求
 * Created by dan on 2016/9/2.
 */
public interface ICallback {

    void callback(String obj);
}

LoginPresenter:View與Presenter打交道的類。進行View中相應數據簡單處理。並調用M層。

 

 

package net.hd.mvpdemo.presenter;

import net.hd.mvpdemo.model.IMvpModel;
import net.hd.mvpdemo.model.LoginModel;

/**
 * Created by dan on 2016/9/2.
 * 

* presenter做為連接view與model。進行數據隔離 * 不同的presenter做不同的數據分發處理 */ public class LoginPresenter implements IMvpPresenter, IMvpModel, ICallback { private IMvpModel model; private ICallback viewCallback; /** * 通過presenter構造方法,創建Model對象,隔離View與Model的聯系 */ public LoginPresenter(ICallback cb) { model = new LoginModel(); viewCallback = cb; } public void operateView(String obj){ operateModel(obj, this); } @Override public void operateModel(String obj, ICallback back) { handModel(obj, back); } /** * 通過callback,完成操作回調數據,通過view更新 */ @Override public void handModel(String obj, ICallback call) { model.handModel(obj, call); } /** * model數據處理完,通過viewcallback回調給上層view * * @param obj */ @Override public void callback(String obj) { viewCallback.callback(obj); } }


IMvpModel:m層接口。對presenter接口編程,就是得應該這樣。對外只展示最簡單的接口即可。

 

 

package net.hd.mvpdemo.model;

import net.hd.mvpdemo.presenter.ICallback;
import java.util.Objects;

/**
 * model層統一實現接口
 * Created by dan on 2016/9/2.
 */
public interface IMvpModel {

    void handModel(String obj, ICallback back);
}

IBaseModel:封裝統一m接口。作用當然就是代碼復用了。其實v、p都應該有的。這樣減少重復代碼。讓實現只專注需求功能。而不要讓每個人都去寫重復的代碼。

 

 

package net.hd.mvpdemo.model;

import net.hd.mvpdemo.presenter.ICallback;

import java.util.Objects;

/**
 * 基礎model,相同的邏輯統一處理
 * 不同的邏輯,再由子類實現
 * Created by dan on 2016/9/2.
 */
public class BaseModel implements IMvpModel  {

    @Override
    public void handModel(String obj,ICallback back) {

    }


}

LoginModel:真正的邏輯處理了。不多解釋了!

 

 

package net.hd.mvpdemo.model;

import net.hd.mvpdemo.presenter.ICallback;

import java.util.Objects;
import java.util.Random;

/**
 * Created by dan on 2016/9/2.
 */
public class LoginModel extends BaseModel {
    /**
     * 模擬登錄
     */
    private void loginAsync(final String obj, final ICallback onCallback) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                int i = new Random().nextInt(1000);

                onCallback.callback(obj + i);
            }
        }).run();
    }

    @Override
    public void handModel(String obj, ICallback back) {
        loginAsync(obj,back);
    }


}

xml其實就是android login的原型,都沒改。

 

 

 


                



                

整個項目,都是以最簡單的方式,把邏輯展示清楚就行。已經不能再簡單了。但是還是比較難體現設計思想。而且真實的項目情況,也不會這麼簡單。這只是做為學習之用了。

不知道大家有沒有看懂了???

代碼還是有空多寫寫,思路就會清楚了。這只是一個很簡單的例子。

有空的時候,再寫個mvvm的例子了。

有問題多交流!!!做技術就是先多想,然後再多寫,最後就多問了!搞清楚明白了,這才是自己的知識。不然,終究只是個代碼搬運工了。

祝大家都能成為大牛。只要你能持之以恆!!!

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