Android MVP模式實踐總結(jié)(附帶簡單例子)

Android MVP模式實踐總結(jié)(附帶簡單例子)

最近在做畢業(yè)設(shè)計汰具,題目不是很難,但是后來發(fā)現(xiàn)功能有點多吟孙,感覺是苦力活聚蝶,還好用的是設(shè)計MVP模式,雖然剛開始也不是特別理解巷挥,不過寫的東西多就會發(fā)現(xiàn)這個模式的好處恰聘。

  1. 代碼雖然好像多了吸占,但思路非常清晰凿宾,敲代碼的速度特別快初厚,特別酸爽。
  2. 出現(xiàn)Bug很容易知道哪里出差錯排作。

粽子亚情,感覺開發(fā)效率快了,然后錯誤少了衫生。

感覺土浸,學MVP最好還是看下官方的介紹,如果英文過得去的話泪酱。

https://github.com/googlesamples/android-architecture/tree/todo-mvp/

首先, 為什么不用傳統(tǒng)的MVC(model, view, controller)呢还最,因為傳統(tǒng)的MVC模式在Android中憋活,把View和controller都雜糅到Activity當中,導致Activity越來越臃腫,使得難以開發(fā)和維護橱乱。而MVP(model, view, presenter)模式中,則把一些業(yè)務邏輯分離出來放到Presenter中作瞄,在MVP中的M(model)和V(view)是沒有箭頭連接的危纫,也就是MVP中(View只需要做些與用戶相關(guān)的操作,即繪制界面以及與用戶交互)契耿,其他的業(yè)務功能邏輯都交由Presenter來完成。

在官方介紹中有Contract這個Interface,里面定義了View和Presenter接口透敌,其實Contract在mvp中什么角色也不是酗电,只是把view和presenter定義在一起方便管理内列。

現(xiàn)在給個簡單例子:

  1. 假設(shè)我們要從網(wǎng)絡獲取數(shù)據(jù)并顯示用戶的個人界面话瞧;
  2. 同時我們可以更改用戶數(shù)據(jù)并上傳到服務器;
  3. 為了簡單起見并不真正的獲取網(wǎng)絡數(shù)據(jù)移稳,也省去了異步等操作,在實際開發(fā)中都是要考慮的个粱。

首先來看View和Presenter的接口定義

public interface BasePresenter {
    void start();
}

public interface BaseView<T> {
    void setPresenter(T presenter);
}

public interface UserInfoContract {

    interface Presenter extends BasePresenter{
        void loadUserInfo(); 
        void changeAge();
    }
    interface View extends BaseView<Presenter>{
        void showUserInfoView(UserInfo userInfo);
        void showErrorMessage(String errMsg);
        UserInfo getUserInfo();

    }
}

可以看到在BaseView這個基類接口中含有setPresenter古毛,從圖上也可以看出,View和Presenter是可以相互交換數(shù)據(jù)的都许,所以一般都會互相持有對方的引用稻薇。我們再看看它們的實現(xiàn)類。

public class UserInfoActivity extends AppCompatActivity implements UserInfoContract.View{

    TextView nameTxt;
    TextView ageTxt;
    EditText newAgeEdit;
    Button change;
    UserInfoContract.Presenter presenter;
    UserInfo info;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user_info);
        nameTxt = (TextView)findViewById(R.id.name);
        ageTxt = (TextView)findViewById(R.id.age);
        newAgeEdit = (EditText)findViewById(R.id.new_age);
        change = (Button)findViewById(R.id.change);
        change.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String str = newAgeEdit.getText().toString();
                if(str.length() !=0 ){
                    int ageInt = Integer.valueOf(str);
                    info.setAge(ageInt);
                    presenter.changeAge();
                }
            }
        });
        //創(chuàng)建Presenter
        UserInfoContract.Presenter presenter =new UserInfoPresenter(this);
    }

    @Override
    public void showUserInfoView(UserInfo userInfo) {
        //更新用戶界面
        info = userInfo;
        nameTxt.setText(userInfo.getName());
        ageTxt.setText(userInfo.getAge() + "");
    }

    @Override
    public void showErrorMessage(String errMsg) {
        //顯示錯誤信息
        Toast.makeText(this,errMsg,Toast.LENGTH_LONG).show();
    }

    @Override
    public UserInfo getUserInfo() {
        return info;
    }

    @Override
    public void setPresenter(UserInfoContract.Presenter presenter) {
        this.presenter = presenter;
    }



}

public class UserInfoPresenter implements UserInfoContract.Presenter {
    UserInfoContract.View view;
    UserInfo info;

    public UserInfo getNetworkData(){
        //模擬網(wǎng)絡io等操作胶征,獲取數(shù)據(jù)
        if(info == null){
            info = new UserInfo();
            info.setAge(16);
            info.setId(1);
            info.setName("lawliex");
        }
        return info;
    }

    public UserInfoPresenter(UserInfoContract.View view) {
        this.view = view;
        view.setPresenter(this);
        start();
    }



    @Override
    public void loadUserInfo() {

        UserInfo userInfo = getNetworkData();

        //取得數(shù)據(jù)后塞椎,因為presenter持有view的引用,可以回調(diào)view的相關(guān)方法睛低,此處假設(shè)加載數(shù)據(jù)成功案狠,回調(diào)顯示正常界面
        view.showUserInfoView(userInfo);
        //如果發(fā)生錯誤則回調(diào)
        //view.showErrorMessage("error");
    }

    @Override
    public void changeAge() {
        info = view.getUserInfo();
        //模擬更新數(shù)據(jù)到服務器钱雷,成功后骂铁,更新View的數(shù)據(jù)
        start();
    }

    @Override
    public void start() {
        loadUserInfo();
    }
}

項目源碼

https://github.com/PoleLive/mvp

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市罩抗,隨后出現(xiàn)的幾起案子拉庵,更是在濱河造成了極大的恐慌,老刑警劉巖套蒂,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钞支,死亡現(xiàn)場離奇詭異茫蛹,居然都是意外死亡,警方通過查閱死者的電腦和手機烁挟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門婴洼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人信夫,你說我怎么就攤上這事窃蹋。” “怎么了静稻?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵警没,是天一觀的道長。 經(jīng)常有香客問我振湾,道長杀迹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任押搪,我火速辦了婚禮树酪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘大州。我一直安慰自己续语,他們只是感情好,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布厦画。 她就那樣靜靜地躺著疮茄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪根暑。 梳的紋絲不亂的頭發(fā)上力试,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機與錄音排嫌,去河邊找鬼畸裳。 笑死,一個胖子當著我的面吹牛淳地,可吹牛的內(nèi)容都是我干的怖糊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼颇象,長吁一口氣:“原來是場噩夢啊……” “哼蓬抄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起夯到,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎饮亏,沒想到半個月后耍贾,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阅爽,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年荐开,在試婚紗的時候發(fā)現(xiàn)自己被綠了付翁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡晃听,死狀恐怖百侧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情能扒,我是刑警寧澤佣渴,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布绷耍,位于F島的核電站处渣,受9級特大地震影響跋选,放射性物質(zhì)發(fā)生泄漏脐区。R本人自食惡果不足惜肌蜻,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一抑党、第九天 我趴在偏房一處隱蔽的房頂上張望么介。 院中可真熱鬧谭跨,春花似錦鹃答、人聲如沸乎澄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽置济。三九已至,卻和暖如春避咆,著一層夾襖步出監(jiān)牢的瞬間舟肉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工查库, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留路媚,地道東北人。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓樊销,卻偏偏與公主長得像整慎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子围苫,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,283評論 25 707
  • 作者:李旺成 時間:2016年4月3日 “Android MVP 詳解(下)”已經(jīng)發(fā)布裤园,歡迎大家提建議。 MVP ...
    diygreen閱讀 128,887評論 86 1,321
  • 轉(zhuǎn)載至:http://www.reibang.com/p/9a6845b26856 “Android MVP 詳解...
    SnowDragonYY閱讀 10,322評論 5 241
  • Android App的設(shè)計架構(gòu):MVC,MVP,MVVM與架構(gòu)經(jīng)驗談1. 架構(gòu)設(shè)計的目的1.1 通過設(shè)計使程序模...
    天空在微笑閱讀 4,151評論 1 20
  • 寶寶剂府,我好想你拧揽,窗外的雨滴聲你聽到了嗎?我一個人蜷在沙發(fā)里,想你淤袜。好想抱著你痒谴,聽你的呼吸,摸摸你扎扎的胡子铡羡。寶积蔚,老...
    濤之源閱讀 465評論 0 0