MVP干貨Demo

這是一個(gè)學(xué)習(xí)MVP模式的Demo.

一個(gè)基于MVP+Retrofit+RxJava+MaterialDesign和gank.io的客戶(hù)端。

github-app

項(xiàng)目截圖

pic1


pic2


pic3


pic4

技術(shù)點(diǎn)

1. Retrofit 的使用,包括使用 Http 緩存、converter 的使用等;

2. RxJava 的使用,包括配合 Retrofit

3. MVP 架構(gòu)實(shí)踐,包括 presenter 的生命周期管理;

4. RecycleView + CardView 的使用;

5. WebView 的使用,包括顯示加載進(jìn)度條、播放視頻等;

6. VideoView 的使用,包括自定義按鈕;

7. Activity滑動(dòng)返回的實(shí)現(xiàn)


項(xiàng)目結(jié)構(gòu)


api:?? 網(wǎng)絡(luò)接口的一些封裝,供Presenter調(diào)用

base:?? 基類(lèi)

bean:?? 實(shí)體類(lèi)

contract:?? presenter 和? view 的接口

presenter:?? presenter 的實(shí)現(xiàn)類(lèi)

view :?

widget:? 自定義的控件類(lèi)

總體框架


GankApi:

public interface GankApi {

????? @GET("api/data/休息視頻/10/{page}")

????? ObservablegetVideoData(@Path("page") int page);

????? @GET("api/day/{day}")

????? ObservablegetGankData(@Path("day") String day);

}

{}為占位符 接收傳入的參數(shù)

ApiManager

public? GankApi mGankApi;

public static final String GANK_URL = "http://gank.io/";

public GankApi getGankService(){
? ? if(mGankApi == null){
? ? ? ? synchronized (newsClientMonitor){
? ? ? ? ? ? if(mGankApi ==null){
? ? ? ? ? ? ? ? mGankApi = new Retrofit.Builder()
? ? ? ? ? ? ? ? ? ? ? .baseUrl(GANK_URL)
? ? ? ? ? ? ? ? ? ? ? .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
? ? ? ? ? ? ? ? ? ? ? .client(client)
? ? ? ? ? ? ? ? ? ? ? .addConverterFactory(GsonConverterFactory.create())
? ? ? ? ? ? ? ? ? ? ? .build().create(GankApi.class);
????????????}
???????? }
????? }
? ? ? return mGankApi;
}

根據(jù)傳入的GankApi得到一個(gè)Subscription對(duì)象,在Presenter中使用

GankPresenter 需要繼承contract的presenter接口

public void getGankData(String day) {

? ? Subscription subscribe = ApiManager.getInstence().getGankService().getGankData(day)

? ? .subscribeOn(Schedulers.io())

? ? .observeOn(AndroidSchedulers.mainThread())

。。。。。。。。。。。。。。。。。。。。。。

Prensenter中調(diào)用getXXData() 方法, 在onNext中得到gson解析完得到的對(duì)象,使用傳進(jìn)來(lái)的view對(duì)象更新數(shù)據(jù),這樣view層與presenter層就能夠很好的被劃分。

activity的作用

activity作為全局的控制者,負(fù)責(zé)創(chuàng)建view以及presenter實(shí)例,并將二者聯(lián)系起來(lái),具體的view交由fragment來(lái)實(shí)現(xiàn),兩者各司其職。

契約類(lèi)(contract)

契約類(lèi)來(lái)統(tǒng)一管理view與presenter的所有的接口,這種方式使得view與presenter中有哪些功能,一目了然,維護(hù)起來(lái)也方便

簡(jiǎn)單歸納

activity創(chuàng)建fragment及實(shí)例化presenter,在實(shí)例化的同時(shí),將fragment作為參數(shù)傳遞進(jìn)去,這樣一來(lái)在presenter中就可調(diào)用view的接口對(duì)界面進(jìn)行更新、展示

presenter實(shí)例化時(shí),還調(diào)用了view的setPresenter方法,將自身傳遞進(jìn)去,這樣一來(lái)fragment獲得了presenter的實(shí)例,便可在view中調(diào)用presenter進(jìn)行業(yè)務(wù)邏輯的操作

view及presenter擁有彼此的實(shí)例,實(shí)現(xiàn)了在view中調(diào)用presenter處理業(yè)務(wù),處理完后再presenter中更新view。

總結(jié)

至此,一個(gè)簡(jiǎn)單的mvp框架到此結(jié)束,對(duì)于mvp的使用目前也還在探索中,上例是結(jié)合官方發(fā)布的demo做的一個(gè)簡(jiǎn)化工程,有不足之處歡迎一起探討交流!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容