這是一個(gè)學(xué)習(xí)MVP模式的Demo.
一個(gè)基于MVP+Retrofit+RxJava+MaterialDesign和gank.io的客戶(hù)端。
項(xiàng)目截圖
技術(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)化工程,有不足之處歡迎一起探討交流!