以前用的MVC,最近換的MPV,優(yōu)勢并沒有具體體會出來,但是代碼的可能性確實提高很多.將一些自己是怎么寫MVP的吧.
參考:http://blog.csdn.net/lmj623565791/article/details/46596109 ?張鴻洋的博客
我參考此文章,然后根據(jù)自己在項目中的理解,整理了一下MVP的書寫順序,可能方便理解.
首先講一下概念,MVP,理解為Model,View,Presenter.其中View指android的界面,就是activity.Model指數(shù)據(jù)源,在此可以理解為所有數(shù)據(jù)都從這個class中獲取.這個時候,界面有了,數(shù)據(jù)有了,怎么填充的呢,那就是Presenter的作用了,Presenter負(fù)責(zé)調(diào)度所有數(shù)據(jù)以及點擊事件.而MVP的本質(zhì),就是通過接口傳遞數(shù)據(jù)與點擊事件,達(dá)到界面和數(shù)據(jù)源之間沒有直接聯(lián)系,解除耦合性.
廢話少說,開始書寫
首先,既然是MVP,那么View,Model,Presenter當(dāng)然都不能少,于是可以創(chuàng)建一下的package
現(xiàn)在,我們在view中創(chuàng)建一個新的activity,就按照登錄為列子吧.
創(chuàng)建LoginActivity
現(xiàn)在寫xml的布局
因為代碼不好復(fù)制,我就截圖了,之后會上傳到github上去,大家可以參考
現(xiàn)在我們會Activity中初始化控件吧.
好了,到目前為止,Activity的先暫時放置.
按照上面的概念,這個時候我們還沒有MVP中的M和P,那就創(chuàng)建他們.
因為要靠接口傳遞信息和事件,那么我們分別給Activity和Model創(chuàng)建Interface.
分別實現(xiàn)各自的接口吧.
因為Presenter是溝通的橋梁,現(xiàn)在開始書寫Presenter
添加屬性:IloginView(這個是接口哦),LoginModel.構(gòu)造方法
現(xiàn)在,去Activity中創(chuàng)建Presenter并初始化.
寫了這么多,好像具體的實現(xiàn)方法都沒有寫出來,別急,這都是需要準(zhǔn)備好的,接下來就是具體實現(xiàn)邏輯的代碼了,可能會比較繞.
在Activity中,給button設(shè)置點擊事件.
這個當(dāng)然應(yīng)該是點擊登錄的事件了,但是我現(xiàn)在這個事件的具體實現(xiàn)代碼,并不在Activity中寫,于是我調(diào)用presenter的方法.
presenter.login()的方法,我只是剛想出來,現(xiàn)在Presenter中還沒有,那么我們就create此方法;
那么里面寫點什么呢?按照我們的邏輯,登錄,肯定要獲取"賬號"和"密碼",然后傳給登錄的接口.
我們已經(jīng)將數(shù)據(jù)獲取強(qiáng)行定義到model中,那么,我們就在model中寫好登錄的方法
.
LoginListener是沒有的,我們自己創(chuàng)建.
既然model中的login()方法創(chuàng)建好了,我們就在presenter中的login()中引用吧.
那么,問題來了,這里的三個參數(shù),從何而來呢?用戶名和密碼當(dāng)然要從Activity中獲取了,如何獲取?簡單的接口傳值而已.
寶寶們可曾記得,我們的IloginView可是一點代碼都沒有寫呀.現(xiàn)在就創(chuàng)建getUserName(),getUserPsd(),getLOginListener()這三個方法吧.
當(dāng)我們創(chuàng)建好這三個方法的時候,Activity報錯了哦,因為我們沒有實現(xiàn)IloginView的方法,那就實現(xiàn)它
咦,這個return是什么?這就是我們要傳遞給presenter的數(shù)據(jù)了. 修改一下return的內(nèi)容吧.
現(xiàn)在我們有了UserName和UserPsd,還有了登錄之后的回調(diào).那么我們?nèi)ズ煤脮鴮懸幌翸odel中的Login()方法吧.
因為我沒有寫接口,就暫時模擬一下,如果都不為空,就算登錄成功,有一個是空的就登錄失敗.好了,我們會Activity的Login回調(diào)中等待吧.
為了方便觀測整個邏輯的結(jié)果,我有給回調(diào)加了吐司.
現(xiàn)在我們測試一下吧.啟動項忘記改了,不好意思......
可能有的小伙伴還會耿耿于懷一件事,就是我們?yōu)長oginModel創(chuàng)建的接口ILoginModel沒有寫內(nèi)容,這是干嘛的呢?
我們現(xiàn)在來模擬另外一件事,我現(xiàn)在要給UserName設(shè)置默認(rèn)值,而這個數(shù)據(jù)又是從Model中獲取的.那么我們就用到這個接口了.
好的,現(xiàn)在回到Activity中,我們使用presenter,創(chuàng)建presenter.setUserNme();方法;
這么看的話,ILoginView中增加setUserName(String username);方法,而這時,LoginModel的getUserName();方法就有些尷尬,可以直接創(chuàng)建,也可以寫在接口中,我推薦寫在接口中,這是可好習(xí)慣.然后實現(xiàn)該方法.
因為添加了ILoginView的setUserName()方法,Activity中實現(xiàn)該方法,此時的參數(shù)userName就是從Model中傳遞過來的.
其實這個ILoginModel就是為了從Model給Presenter傳數(shù)據(jù)的,跟ILoginView都是一樣的作用.
感覺這個寫下來,再根據(jù)自己的項目寫一寫,理解起來就很容易了
https://github.com/QunCheung/MVPDemo ?github的地址,請大家根據(jù)自己的gradle改一下版本,我是3.3的