MVP框架搭建(2):mvp的分塊演示

上一篇主要講mvp的概念颁虐,怎么將原來一個activity分成model,presenter,activity三部分舱权,不熟悉的可以點擊下面鏈接
MVP框架搭建(1):界面數(shù)據(jù)分離
這一片主要講如何將封裝三部分的基類挎春,以及演示三部分如何串聯(lián)起來。

BaseView
當presenter收到網(wǎng)絡(luò)返回的響應(yīng)時枫吧,通過baseView傳遞給activity更新界面

public interface DaggerBaseView {

    /**
     * 顯示網(wǎng)絡(luò)請求加載轉(zhuǎn)圈
     */
    void  showLoading();

    /**
     * 關(guān)閉加載轉(zhuǎn)圈
     */
    void hideloading();

    /**
     * 吐息一些信息
     * @param msg
     */
    void  showToast(String msg);
    void showErr();
    Context getContext();
}

BaseModel
采用了泛型浦旱,防止因為數(shù)據(jù)類型不一致導(dǎo)致創(chuàng)建多個model的基類

public interface DaggerBaseModel <T>{
    /**
     * 創(chuàng)建接口對象
      */
    void getNetApi();

    /**
     * 發(fā)送get請求
     * @param callback
     */
     void requestGetAPI( BaseCallBack<T> callback);

    /**
     * 發(fā)送post請求
     * @param params
     * @param callBack
     */
    void requestPostAPI( Map params, BaseCallBack<T> callBack);

BasePresenter
也用到了泛型,因為每個Presenter里都需要一個View對象九杂,所以用了一個繼承BaseView的泛型對象

public abstract class DaggerBasePresenter<V extends DaggerBaseView,T> implements BaseCallBack<T> {

    private V mvpView;

    /**
     * 綁定view颁湖,在獲取網(wǎng)絡(luò)響應(yīng)之后通過view傳遞給activity
     * @param mvpView
     */
    public void attachView(V mvpView){
        this.mvpView=mvpView;
    }

    /**
     * 解綁view
     */
    public void detachView(){
        this.mvpView=null;
    }

    /**
     * 判斷是否解綁 在網(wǎng)絡(luò)請求時頁面被終結(jié)宣蠕,導(dǎo)致后續(xù)出現(xiàn)nullpointException
     * @return
     */
    public boolean isViewAttached(){
        return mvpView!=null;
    }

    public V getMvpView(){
        return mvpView;
    }

    /**
     * 在頁面對象創(chuàng)建完成后調(diào)用,可以用來初始化數(shù)據(jù)層對象
     */
    public abstract void onStart();
}

BaseActivity
使用了一個presenter的泛型爷狈,一個view的泛型植影, 每個邏輯不同的頁面要生成不同的view和presenter

public abstract class DaggerBaseActivity<V extends DaggerBaseView,T extends DaggerBasePresenter> extends Activity implements DaggerBaseView {

    protected T presenter;
    private ProgressDialog progressDialog;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getLayoutRes());
        //將當前activity加入自定義的app管理中
        AppManager.getInstance().addActivity(this);
        presenter=creatPresenter();
        if(presenter!=null){
            //綁定當前頁面的view,用于presnter獲取數(shù)據(jù)之后控制activity的變化
            presenter.attachView((V)this);
        }
        ButterKnife.bind(this);
        progressDialog=new ProgressDialog(this);
        progressDialog.setCancelable(false);
        init(savedInstanceState);
        if(presenter!=null){
            presenter.onStart();
        }
    }

    /**
     * 做一些初始化操作
     * @param savedInstanceState
     */
    protected abstract void init(Bundle savedInstanceState);

    /**
     * 指定需要加載的布局文件
     * @return
     */
    protected abstract int getLayoutRes();

    /**
     * 創(chuàng)建presenter對象
     */
    protected abstract T creatPresenter();

    /**
     * 使用presenter對象
     * @return
     */
    public T getPresnter(){
       return presenter;
    }

    @Override
    public void showLoading() {
        progressDialog.show();
    }

    @Override
    public void hideloading() {
        progressDialog.hide();
    }

    @Override
    public void showToast(String msg) {
        Toast.makeText(getContext(),msg,Toast.LENGTH_SHORT).show();
    }

    @Override
    public void showErr() {
        Toast.makeText(getContext(),"出錯",Toast.LENGTH_SHORT).show();
    }

    @Override
    public Context getContext() {
        return DaggerBaseActivity.this;
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(presenter!=null){
            presenter.detachView();
        }
        presenter=null;
        AppManager.getInstance().finishActivity(this);
    }
}

需要導(dǎo)入的三方依賴

    compile 'com.jakewharton:butterknife:7.0.1'
    //rxjava與retrofit
    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
    compile 'io.reactivex.rxjava2:rxjava:2.0.7'
    // Android 支持 Retrofit
    compile 'com.squareup.retrofit2:retrofit:2.1.0'
    // 銜接 Retrofit & RxJava
    // 此處一定要注意使用RxJava2的版本
    compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
    // 支持Gson解析
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'
下面展示一個例子,演示怎么使用

api接口 這里用到是愛詞霸的公開接口做測試涎永,大家可以在網(wǎng)上查找

public interface GetDatas {
    @GET(Urls.test)
    Observable<Translation> getCall();
}

model實現(xiàn)獲取網(wǎng)絡(luò)數(shù)據(jù)的方法

public class YoudaoDataModel implements DaggerBaseModel<String> {

    GetDatas getDatas;

    @Override
    public void getNetApi() {
        getDatas= ApiFactory.getInstance().create(GetDatas.class);
    }

    @Override
    public void requestGetAPI(final BaseCallBack<String> callback) {
        getDatas.getCall()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<Translation>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.e("yzh","onSubscribe");
            }

            @Override
            public void onNext(Translation translation) {
                Log.e("yzh","oNext--"+translation.show());
                callback.onSuccess(translation.show());
            }

            @Override
            public void onError(Throwable e) {
                Log.e("yzh","onError--"+e.getMessage());
                callback.onFailure(e.getMessage());
            }

            @Override
            public void onComplete() {
                Log.e("yzh","onComplete--");
                callback.onComplete();
            }
        });
    }

    @Override
    public void requestPostAPI( Map params, BaseCallBack<String> callBack) {
    }

view繼承基類思币,添加當前頁面需要的額外方法

public interface YouDaoView extends DaggerBaseView {
    /**
     * 加載網(wǎng)絡(luò)請求回來的數(shù)據(jù)
     * @param msg
     */
    void showNetData(String msg);
}

presenter現(xiàn)在在基類中是實現(xiàn)callback,在具體頁面時用泛型傳遞具體的數(shù)據(jù)類型,之前是在網(wǎng)絡(luò)請求的時候直接new一個callback羡微,還沒對比出哪個更好一些

public class YouDaoPresenter extends DaggerBasePresenter<YouDaoView,String> {

    private YoudaoDataModel youdaoDataModel;

    @Override
    public void onStart() {
        youdaoDataModel=new YoudaoDataModel();
        youdaoDataModel.getNetApi();
    }

    public void getNetData(){
        if(!isViewAttached()){
            //已經(jīng)解綁了
            return;
        }
        getMvpView().showLoading();
        youdaoDataModel.requestGetAPI(this);
    }

    @Override
    public void onSuccess(String data) {
        if(isViewAttached()){
            getMvpView().showNetData(data);
        }
    }

    @Override
    public void onFailure(String msg) {
        if(isViewAttached()){
            getMvpView().showToast(msg);
            getMvpView().hideloading();
        }
    }

    @Override
    public void onError() {
        if(isViewAttached()){
            getMvpView().hideloading();
            getMvpView().showErr();
        }
    }

    @Override
    public void onComplete() {
        if(isViewAttached()){
            getMvpView().hideloading();
        }
    }

Activity

public class YoudaoActivity extends DaggerBaseActivity<YouDaoView,YouDaoPresenter> implements YouDaoView {

   @Bind(R.id.tv_get_data)
   TextView tv_get_data;
   @Bind(R.id.tv_data)
   TextView tv_data;

    @Override
    public void showNetData(String msg) {
        tv_data.setText(msg);
    }

    @Override
    protected void init(Bundle savedInstanceState) {

    }

    @Override
    protected int getLayoutRes() {
        return R.layout.activity_youdao;
    }

    @Override
    protected YouDaoPresenter creatPresenter() {
        return new YouDaoPresenter();
    }

    @OnClick(R.id.tv_get_data)
    public void getNetData(){
        presenter.getNetData();
    }
}
演示效果

谷饿。。妈倔。博投。gif傳不上去,各位看官就自行code吧

下一步會優(yōu)化網(wǎng)絡(luò)請求方式這一塊盯蝴,包括返回數(shù)據(jù)結(jié)構(gòu)的優(yōu)化毅哗,大家可以看到這些類都帶了一個Dagger,沒錯我就是要用Dagger做解耦,但是我好像在入門到放棄的道路上越走越遠了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捧挺,一起剝皮案震驚了整個濱河市虑绵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌闽烙,老刑警劉巖翅睛,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異黑竞,居然都是意外死亡捕发,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門很魂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扎酷,“玉大人,你說我怎么就攤上這事莫换∠夹” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵拉岁,是天一觀的道長坷剧。 經(jīng)常有香客問我,道長喊暖,這世上最難降的妖魔是什么惫企? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上狞尔,老公的妹妹穿的比我還像新娘丛版。我一直安慰自己,他們只是感情好偏序,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布页畦。 她就那樣靜靜地躺著,像睡著了一般研儒。 火紅的嫁衣襯著肌膚如雪豫缨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天端朵,我揣著相機與錄音好芭,去河邊找鬼。 笑死冲呢,一個胖子當著我的面吹牛舍败,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播敬拓,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼邻薯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了乘凸?” 一聲冷哼從身側(cè)響起弛说,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎翰意,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體信柿,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡冀偶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了渔嚷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片进鸠。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖形病,靈堂內(nèi)的尸體忽然破棺而出客年,到底是詐尸還是另有隱情,我是刑警寧澤漠吻,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布量瓜,位于F島的核電站,受9級特大地震影響途乃,放射性物質(zhì)發(fā)生泄漏绍傲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望烫饼。 院中可真熱鬧猎塞,春花似錦、人聲如沸杠纵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽比藻。三九已至铝量,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間韩容,已是汗流浹背款违。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留群凶,地道東北人插爹。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像请梢,于是被迫代替她去往敵國和親赠尾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容

  • “我想要找個老家的姑娘”宿舍夜談的時候我說毅弧。 說這話的時候气嫁,我滿腦子都是你的樣子,也許只是你停留在我腦海里的...
    記憶已朦朧閱讀 236評論 0 0
  • 文//冰紫嫣 窗外的夜空中够坐,時而有閃電劃過寸宵,伴著轟轟的雷聲,雨點落了下來元咙。這場雨除了把空氣中的浮塵...
    冰紫嫣原創(chuàng)閱讀 659評論 2 3
  • 在未來某一天梯影,地球停止了轉(zhuǎn)動,像一臺終于耗盡了燃料的機器庶香。有一邊一直是光明的甲棍。而另一邊卻一直是黑暗的。在黑...
    海棠味的棒棒糖閱讀 194評論 0 0
  • 天之大赶掖、地之遙感猛、大地萬物在微笑; 春之昂奢赂、夏未到陪白、風吹麥浪像歌謠。 心中海膳灶、蒼狼嘯拷泽、喜怒哀樂都來到; 光之陰、時間...
    Cinko閱讀 573評論 0 17