安卓日記——MVP重構(gòu)知乎日報

在之前安卓日記——手把手教你做知乎日報已經(jīng)教大家分析和利用API做出一個簡單的知乎日報,源碼在github上也收到了5個star
最近我一直很想用一下一直很玄乎的MVP,主要參照谷歌的todo-mvp-rxjava
然后我就想不如就把知乎日報用MVP重構(gòu)一下吧

我理解中的MVP,以數(shù)據(jù)庫或者網(wǎng)絡(luò)請求作為M(通常多個共用,所以不單獨寫)一個Fragment或者Activity作為V,然后把之前的業(yè)務(wù)邏輯都寫在P里。
有人把P當(dāng)作老板,去指使M和V
而我認(rèn)為V才是大BOSS,V中創(chuàng)建P,然后把些粗活累活都交給P,P把數(shù)據(jù)獲取外包給M,然后V說我只要看到結(jié)果,接收到P傳來的結(jié)果,就心滿意足了

項目可以按照模塊分包(登錄功能,注冊功能……),也可以按照組件分包(P分一類,V分一類……)
我模仿谷歌的todo-mvp-rxjava采用模塊分包

這里寫圖片描述

我看過很多mvp的項目,他們很多是按組件分包的,而且他們都沒有一個Contract
在我看來Contract是很有必要的,有了它把職責(zé)的分明了,互相調(diào)用的方法暴露出來,這樣開發(fā)的目的會更加明確,分工也更加簡單

事不宜遲,現(xiàn)在開始講如何進行重構(gòu)
我假設(shè)你們都已經(jīng)懂得如何用我之前的方法做一個知乎日報

1.分析功能模塊

這里主要有首頁和詳情頁兩個模塊

2.寫基類

基類不僅節(jié)省代碼,提高效率,這個不用說了吧

public interface BasePrecenter {
    void subscribe();
    void unsubscribe();
}
public interface BaseView<T extends BasePrecenter> {
    void setPrecenter(T precenter);
}

3.寫Contract

Contract中可以不包含M,因為M通常都是公用的,所以單獨放,我這Service就是M,主要是網(wǎng)絡(luò)請求數(shù)據(jù)

public interface ArticleContract {
    interface View extends BaseView<Precenter>{
        void showAtrticleDetail(String content);
    }
    interface Precenter extends BasePrecenter{
        void loadArticleDetail(int id);
    }
}

4.寫B(tài)ean和Model

確定好數(shù)據(jù)的格式和獲取的方式
我這里采用的是用retrofit獲取數(shù)據(jù)

public interface ActionService {
    public static String baseUrl="http://news-at.zhihu.com";
    //今日頭條
    @GET("/api/4/news/latest")
    Observable<RootBean> getLatestNews();
    //互聯(lián)網(wǎng)安全
    @GET("/api/4/theme/10")
    Observable<RootBean> getSafety();
    //不準(zhǔn)無聊
    @GET("/api/4/theme/11")
    Observable<RootBean> getInterest();
    //體育日報
    @GET("/api/4/theme/8")
    Observable<RootBean> getSport();
    //傳入id查看詳細(xì)信息
    @GET("/api/4/news/{id}")
    Observable<ArticleDetailBean> getNewsDetails(@Path("id") int id);

}

5.然后再寫P和V

V中創(chuàng)建P,創(chuàng)建P需要傳入V

        //創(chuàng)建P傳入V
        precenter=new HomePrecenter(this);
        setPrecenter(precenter);

P中綁定V,并且創(chuàng)建M

 public HomePrecenter(HomeContract.View view){
        //綁定V
        this.view=view;
        //創(chuàng)建M
        service= ServiceFactory.createRetrofitService(ActionService.class,ActionService.baseUrl);
    }

之后主要是一些互相調(diào)用Contract中約定好的方法

補充:

P中有subscribe和unsubscribe方法可以與V中的onResume和onPause方法綁定
這樣V開始時繼續(xù)P的業(yè)務(wù),暫停時停止P的邏輯

    @Override
    public void onResume() {
        super.onResume();
        precenter.subscribe();
    }

    @Override
    public void onPause() {
        super.onPause();
        precenter.unsubscribe();
    }
}

P中將要執(zhí)行的業(yè)務(wù)都添加進CompositeSubscription中,unsubscribe時把CompositeSubscription清空掉

                subscription.add(rootBean
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<RootBean>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(RootBean rootBean) {
                        view.showArticle(rootBean.getStories());
                    }
                }));
 @Override
    public void unsubscribe() {
        subscription.clear();
    }

重構(gòu)后竟然一次通過了,太興奮了

效果圖

這里寫圖片描述

源碼下載

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

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,153評論 25 708
  • 前言 看了下上篇博客的發(fā)表時間到這篇博客,竟然過了11個月,罪過,罪過。這一年時間也是夠折騰的,年初離職跳槽到鵝廠...
    西木柚子閱讀 21,425評論 12 183
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,618評論 19 139
  • 外聯(lián)一家人閱讀 171評論 0 0
  • 見 驚艷 目流連 再難思遷 躊躇欲向前 只恐天上人間 悲歡喜怒一線牽 循環(huán)往復(fù)恨此心堅 花開花落轉(zhuǎn)眼已三年 天人合...
    小隨筆閱讀 1,132評論 0 2

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