當前位置:
首頁 > 最新 > MVP的初步認識

MVP的初步認識

為何MVP模式能在Android開發中大放異彩,我覺得很大一部分原因來源與傳統的model-view的開發模式使得everything is connected with Activity。MVP開發模式使一部分的業務邏輯從Activity中抽取出來。

那MVP是怎樣的呢?

我們先理清M(model)V(view)P(presenter)他們各自的職責

V(view)界面層:負責與用戶交互展示數據與刷新界面

P(presenter)業務邏輯層:主要負責處理業務邏輯

M(model)數據訪問層:負責數據載入

用一張圖一句話大概的概括下他們之間的流程:

View層在交互需要數據時通知Presenter層,讓Presenter去向Model層要數據,當model層載入好數據後通過回調傳給Presenter層,Presenter在拿到數據後對數據進行業務邏輯處理,在處理完成後發送給View進行更新界面。

通過一個Demo來貫通下流程:Github地址先看下項目整體結構:

View層

在我看來View層的理想狀態應該是只有三類方法,分別是

initView();//初始化控制項 loadData();//向Presenter請求數據 setView(Data data);//將Presenter處理完的數據傳遞給View顯示

View在項目中可以是多個,根據實際項目情況可以將某一頁面或則某一部分控制項劃分在一個View下,通常Activity和Fragment也劃分在View層,我們來看下項目中MainActivity.java的代碼:

/** * 初始化視圖 */ @Override public void initView() { setContentView(R.layout.activity_main); jokelistview = (ListView) this.findViewById(R.id.lv_joke); tv_toast = (TextView) this.findViewById(R.id.tv_toast); } @Override public void loadData() { jokeAdapter = new JokeListViewAdapter(this,resultBeanList); jokelistview.setAdapter(jokeAdapter); //通知presenter載入數據 jokePresenterimpl.getJoke(PAGER_NUM,PAGER_SIZE); } /** * 將presenter處理完成的數據傳給View * @param jokeResult */ @Override public void setJoke(JokeResult jokeResult) { if(jokeResult!=null){ resultBeanList = jokeResult.getResult(); if(resultBeanList!=null){ jokeAdapter.addAll(resultBeanList); } } }Presenter層

當View層在loadData()中通過調用presenter的getJoke()來載入數據時,通知model的載入數據的方法來載入數據,如項目中JokePresenterimpl.java的getJoke()方法:

@Override public void getJoke(int pagerNum, int size) { jokeView.showloading(); //通知model層來載入數據 jokeModel.getJoke(pagerNum, size, new JokeModel.JokeLoadListener() { //在onSucess()和onError()方法中做業務邏輯處理(這裡沒啥可處理的),處理完成通知View更新界面 @Override public void onSucess(JokeResult response) { //通知View層更新界面 jokeView.setJoke(response); jokeView.hideloading(); } @Override public void onError() { //通知View層更新界面 jokeView.loadErr(); } }); }Model層

model層就比較簡單了,只是簡單的做數據的載入操作,在載入數據完成時,通過介面回調給presenter層做數據業務邏輯處理:

/** * 載入數據 */ @Override public void getJoke(int page, int size,JokeLoadListener jokeListener) { this.jokeLoadListener=jokeListener; VolleyRequest.newInstance().newGsonRequest(joke_url + "key=" + app_key + "&page=" + page + "&rows" + size, JokeResult.class , new Response.Listener() { @Override public void onResponse(JokeResult response) { //將載入結果回調給presenter層 if(response==null){ jokeLoadListener.onError(); }else{ jokeLoadListener.onSucess(response); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { //將載入結果回調給presenter層 jokeLoadListener.onError(); } }); }小結

MVP模式相對於傳統的Model-View模式一定程度上的使得業務邏輯處理與View層分離,相對於MVC模式降低了代碼的耦合,但是在我看來MVP模式在Android開發中使用還是有一定的不足

代碼量增

Activity的界線劃分不明確,放在View層的話Intent的傳遞,FragmentTransaction等操作出現位置不對,使得View層不能與業務邏輯層撇清

View層與Presenter層關係過於緊密,不利於後期維護

其中將Activity與Fragment放置在Presenter層有一個有趣的例子可以一看(一種在android中實現MVP模式的新思路),但是在項目中不能為了模式而模式,否則後期擴展會讓人崩潰。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 推酷 的精彩文章:

Google Assistant 簡史,語音助手已是谷歌一個人的賽跑
為什麼你不應該再使用『var』 –Hacker Noon
為什麼你必須摒棄 Java,全面轉向 Kotlin 語言?
UI的骨骼?始章
Gartner:企業重新思考軟體安全戰略

TAG:推酷 |

您可能感興趣

准MVP何其多,可真MVP恐將是兄弟相殘
2018年NBA全明星,新狼王入選,MVP最委屈,FMVP落選
一攻一防,彰顯登哥MVP價值
SKT輔助Wolf轉型打野,首局拿下MVP
Faker賽後大發牢騷:上中下路都是我打開的,MVP卻是Bang和Wolf!
Rookie蟬聯LPL常規賽Mvp,網友表示擔心:不會又是安慰獎吧
LOL:小明讓Karsa聞腳丫,網友調侃:拿了兩把Mvp膨脹了
DOTA2:賓士又躺槍!ESL one賽事KG贏了比賽mvp沒了
MVP榜阿杜繼續領銜!庫里強勢殺入前三!
鎮魂街:全場最佳ADC,他不拿mvp我第一個不同意!
NBA新看點:馬刺輸球,17載老MVP讓位二年級新秀!網友:扎心了
致命三分鎖定勝局!火箭保羅賽後公開稱讚哈登MVP,網友不滿:NO
LCK季後賽:SKT首局贏了KT,Bang用小炮打出爆炸傷害拿下mvp!
FMVP八年首次替補!聯盟教父的套路一般人不懂
德帥第一次拋殺手鐧,7個三分打懵勇士!哈登的MVP和總冠軍穩了?
淚目!小狗打破無冠魔咒,RNG擊敗宿敵EDG,Uzi拿下總決賽Mvp!
繽紛夏日!PUMA thunder迎來新成員、Adidas熒光黃迎接夏日、mvp
LCK簡報 KT打破時長記錄 2比0險勝MVP
刀塔2:賓士又躺槍!ESL one賽事KG贏了比賽mvp沒了
RNG兵不血刃拿下勝利:麻辣凶鍋主宰野區,走A怪首獲MVP