RxJava+Retrofit+OkHttp深入淺出-mvp(使用篇)
背景
RxJava+Retrofit+OkHttp
封裝系列也基本完成了,功能無太大疊代的需要,但是最近
QQ
群中有兄弟問如何結合
mvp
使用這套架構,仔細考慮下确實作在結合
mvp
開發項目已經是一種大趨勢,不得不感歎現在技術更新的真是太快了,是以決定再一次操刀講解下結合
mvp
使用需要注意的細節。
思路
既然是結合
mvp
,那就必須先了解
mvp
是很方聖神了,之前也出過相關的博文,就不啰嗦了。在了解了
mvp
的特效後,之前的封裝大緻需要做出以下修改:
- 剔除加載框統一處理,采用接口
層中手動顯示調用view
- 簡化
功能,去掉無用的ProgressSubscriber
依賴,降低耦合content
- 将網絡處理加入
架構的mvp
層處理model
思路完成了,重度使用患者估計已經完全明白了。開始我們的使用
mvp
簡單使用
mvp
先簡單的來一個例子,幫對
mvp
不懂的同學複習下。
view
接口
view
定義
view
層回調接口
public interface Vlistener {
void onTestNext(String msg);
}
presenter
接口
presenter
定義兩個接口,一個使用者
view
層,一個用于
model
,確定Model層不直接操作View層;
p
層提供給 v
層的接口
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
/**
* mvp 中p層提供給m層使用的接口
* Created by WZG on 2016/12/26.
*/
public interface PVlistener {
/**
* 測試回調
* @param msg
*/
void testPSuc(String msg);
}
m
層提供給 p
層的接口
m
p
/**
* m層提供給p層的接口
* Created by WZG on 2016/12/26.
*/
public interface Mlistener {
/**
* 測試接口
* @param s
*/
void testDo(String s);
}
view
層事件調用
view
view
層擁有一個
presenter
層的引用,觸發事件後調用
presenter
層接口處理。
private Plistener plistener;
@OnClick(value = R.id.tv_test)
void onTvTestClick(View view) {
plistener.doTest("1");
}
presenter
層調用 model
層接口初始資料
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
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
使用
RxRetorift
view
層添加接口
view
public interface Vlistener {
void onTestNext(String msg);
void showProg();
void dismissProg();
void onNext(String s,String m);
void onError(ApiException e);
}
view
回調實作
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
添加接口
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
實作
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
層接口
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
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深入淺出-終極封裝專欄)
源碼
傳送門-下載下傳封裝源碼
建議
如果你對這套封裝有任何的問題和建議歡迎加入QQ群告訴我!