天天看點

RxJava+Retrofit+OkHttp深入淺出-mvp(使用篇)RxJava+Retrofit+OkHttp深入淺出-mvp(使用篇)

RxJava+Retrofit+OkHttp深入淺出-mvp(使用篇)

背景

RxJava+Retrofit+OkHttp

封裝系列也基本完成了,功能無太大疊代的需要,但是最近

QQ

群中有兄弟問如何結合

mvp

使用這套架構,仔細考慮下确實作在結合

mvp

開發項目已經是一種大趨勢,不得不感歎現在技術更新的真是太快了,是以決定再一次操刀講解下結合

mvp

使用需要注意的細節。

思路

既然是結合

mvp

,那就必須先了解

mvp

是很方聖神了,之前也出過相關的博文,就不啰嗦了。在了解了

mvp

的特效後,之前的封裝大緻需要做出以下修改:

  • 剔除加載框統一處理,采用接口

    view

    層中手動顯示調用
  • 簡化

    ProgressSubscriber

    功能,去掉無用的

    content

    依賴,降低耦合
  • 将網絡處理加入

    mvp

    架構的

    model

    層處理

思路完成了,重度使用患者估計已經完全明白了。開始我們的使用

mvp

簡單使用

先簡單的來一個例子,幫對

mvp

不懂的同學複習下。

view

接口

定義

view

層回調接口

public interface Vlistener {

    void onTestNext(String msg);
}
           

presenter

接口

定義兩個接口,一個使用者

view

層,一個用于

model

,確定Model層不直接操作View層;

p

層提供給

v

層的接口

/**
 * p層提供給v層的接口
 * Created by WZG on 2016/12/26.
 */
public interface Plistener {

    /**
     * 其他方法-示範
     * @param msg
     */
    void doTest(String msg);

}
           

mvp

p

層提供給

m

層使用的接口

/**
 * mvp 中p層提供給m層使用的接口
 * Created by WZG on 2016/12/26.
 */

public interface PVlistener {

    /**
     * 測試回調
     * @param msg
     */
    void testPSuc(String msg);
}
           

m

層提供給

p

層的接口

/**
 * m層提供給p層的接口
 * Created by WZG on 2016/12/26.
 */

public interface Mlistener {
    /**
     * 測試接口
     * @param s
     */
    void testDo(String s);
}
           

view

層事件調用

view

層擁有一個

presenter

層的引用,觸發事件後調用

presenter

層接口處理。

private Plistener plistener;

@OnClick(value = R.id.tv_test)
    void onTvTestClick(View view) {
        plistener.doTest("1");
    }
           

presenter

層調用

model

層接口初始資料

public class P implements Plistener,PVlistener{
    private Vlistener vlistener;
    private Mlistener mlistener;

    public P(Vlistener viewListener) {
        this.vlistener = viewListener;
        mlistener =new M(this);
    }

    @Override
    public void doTest(String msg) {
        mlistener.testDo(msg);
    }

    @Override
    public void testPSuc(String msg) {
        vlistener.onTestNext(msg);
    }
           

model

層處理資料,回調給

presenter

presenter

回調給

view

public class M implements Mlistener{
    private PVlistener pVlistener;

    public M(PVlistener pVlistener) {
        this.pVlistener = pVlistener;
    }

    @Override
    public void testDo(String s) {
        String msg = "M" + s;
        pVlistener.testPSuc(msg);
    }
}
           

presenter

層傳遞給

view

@Override
    public void testPSuc(String msg) {
        vlistener.onTestNext(msg);
    }
           

通過以上的僞代碼,大緻了解了

mvp

調用的執行過程,是以結合

RxRetrofit

使用隻需要各層添加對應的接口,在

model

層中觸發

http

請求即可;

結合

RxRetorift

使用

view

層添加接口

public interface Vlistener {

    void onTestNext(String msg);

    void showProg();

    void dismissProg();

    void onNext(String s,String m);

    void  onError(ApiException e);

}
           

view

回調實作

首先封裝一個簡單的

BaseActivity

處理公用的加載框顯示和隐藏處理

public class BaseActivity extends RxAppCompatActivity {
    //    加載框可自己定義
    protected ProgressDialog pd;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(pd==null){
            pd = new ProgressDialog(this);
            pd.setCancelable(false);
        }
    }

    protected void showP(){
        if(pd!=null&&!pd.isShowing()){
            pd.show();
        }
    }

    protected void dismissP(){
        if(pd!=null&&pd.isShowing()){
            pd.dismiss();
        }
    }
}
           

view

層回調界面顯示處理

public class MvpActivity extends BaseActivity implements Vlistener {
    @BindView(R.id.tv_test)
    TextView tvTest;
    @BindView(R.id.tv_msg)
    TextView tvMsg;
    private Plistener plistener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mvp);
        ButterKnife.bind(this);
        plistener = new P(this);
    }


    @OnClick(value = R.id.tv_test)
    void onTvTestClick(View view) {
        plistener.doTest("1");
    }


    @OnClick(value = R.id.tv_msg)
    void onTvMsgClick(View view) {
        SubjectPostApi postEntity = new SubjectPostApi();
        postEntity.setAll(true);
        plistener.startPost(MvpActivity.this, postEntity);
    }


    @Override
    public void showProg() {
        showP();
    }

    @Override
    public void dismissProg() {
        dismissP();
    }

    @Override
    public void onNext(String s, String m) {
        tvMsg.setText("傳回資料:" + s);
    }

    @Override
    public void onError(ApiException e) {
        tvMsg.setText("錯誤資訊:" + e.getMessage() + "------" + e.getCode());
    }

    @Override
    public void onTestNext(String msg) {
        tvTest.setText("測試傳回資料了:" + msg);
    }

}
           

presenter

添加接口

事件觸發接口

/**
 * p層提供給v層的接口
 * Created by WZG on 2016/12/26.
 */

public interface Plistener {
    /**
     * http請求
     * @param rxAppCompatActivity
     * @param baseApi
     */
    void startPost(RxAppCompatActivity rxAppCompatActivity, BaseApi baseApi);

    /**
     * 其他方法-示範
     * @param msg
     */
    void doTest(String msg);

}
           

view

回調接口

/**
 * mvp 中p層提供給m層使用的接口
 * Created by WZG on 2016/12/26.
 */

public interface PVlistener {

    /**
     * 測試回調
     * @param msg
     */
    void testPSuc(String msg);

    /**
     * 成功後回調方法
     *
     * @param resulte
     * @param mothead
     */
    void onNext(String resulte, String mothead);

    /**
     * 失敗
     * 失敗或者錯誤方法
     * 自定義異常處理
     *
     * @param e
     */
    void onError(ApiException e);
}
           

presenter

實作

當觸發以後,完全交給

model

層處理,當結果傳回時,傳遞給

view

即可

/**
 * presenter兩個接口,一個請求一個回調
 * 目的:確定Model層不直接操作View層
 * Created by WZG on 2016/12/26.
 */

public class P implements Plistener,PVlistener{

    private Vlistener vlistener;

    private Mlistener mlistener;


    public P(Vlistener viewListener) {
        this.vlistener = viewListener;
        mlistener =new M(this);
    }

    @Override
    public void startPost(RxAppCompatActivity rxAppCompatActivity, BaseApi baseApi) {
        vlistener.showProg();
        mlistener.startPost(rxAppCompatActivity,baseApi);
    }

    @Override
    public void doTest(String msg) {
        mlistener.testDo(msg);
    }


    @Override
    public void testPSuc(String msg) {
        vlistener.onTestNext(msg);
    }


    @Override
    public void onNext(String resulte, String mothead) {
        vlistener.onNext(resulte,mothead);
        vlistener.dismissProg();
    }


    @Override
    public void onError(ApiException e) {
        vlistener.onError(e);
        vlistener.dismissProg();
    }
}
           

model

層接口

/**
 * m層提供給p層的接口
 * Created by WZG on 2016/12/26.
 */

public interface Mlistener {

    /**
     * 開始任務
     * @param rxAppCompatActivity
     * @param baseApi
     */
    void startPost(RxAppCompatActivity rxAppCompatActivity, BaseApi baseApi);

    /**
     * 測試接口
     * @param s
     */
    void testDo(String s);

}
           

model

層實作

model

層中出了實作自定義的接口外,還需要實作

Retrofit

回調接口的處理,在伺服器傳回資料後及時處理,回調給

presenter

層的

PVlistener

/**
 * m層資料處理
 * Created by WZG on 2016/12/26.
 */

public class M implements Mlistener, HttpOnNextListener {
    private PVlistener pVlistener;

    public M(PVlistener pVlistener) {
        this.pVlistener = pVlistener;
    }

    @Override
    public void startPost(RxAppCompatActivity rxAppCompatActivity, BaseApi baseApi) {
        HttpManager manager = new HttpManager(this, rxAppCompatActivity);
        manager.doHttpDeal(baseApi);
    }

    @Override
    public void testDo(String s) {
        String msg = "M" + s;
        pVlistener.testPSuc(msg);
    }


    @Override
    public void onNext(String resulte, String mothead) {
        pVlistener.onNext(resulte, mothead);
    }

    @Override
    public void onError(ApiException e) {
        pVlistener.onError(e);
    }
}
           

到這裡一套适用于

mvp

+

RxRetrofit

的架構就運用而生了,當然你可以繼續添加功能,這裡隻是簡單的給出使用的思路。

實作效果

RxJava+Retrofit+OkHttp深入淺出-mvp(使用篇)RxJava+Retrofit+OkHttp深入淺出-mvp(使用篇)

終極封裝專欄

RxJava+Retrofit+OkHttp深入淺出-終極封裝專欄)

源碼

傳送門-下載下傳封裝源碼

建議

如果你對這套封裝有任何的問題和建議歡迎加入QQ群告訴我!