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);
}
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
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);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
mvp
中p
層提供給m
層使用的介面
/**
* mvp 中p層提供給m層使用的介面
* Created by WZG on 2016/12/26.
*/
public interface PVlistener {
/**
* 測試回撥
* @param msg
*/
void testPSuc(String msg);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
m
層提供給p
層的介面
/**
* m層提供給p層的介面
* Created by WZG on 2016/12/26.
*/
public interface Mlistener {
/**
* 測試介面
* @param s
*/
void testDo(String s);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
view
層事件呼叫
view
層擁有一個presenter
層的引用,觸發事件後呼叫presenter
層介面處理。
private Plistener plistener;
@OnClick(value = R.id.tv_test)
void onTvTestClick(View view) {
plistener.doTest("1");
}
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
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);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
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);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
presenter
層傳遞給view
@Override
public void testPSuc(String msg) {
vlistener.onTestNext(msg);
}
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
通過以上的虛擬碼,大致瞭解了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);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
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();
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
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);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
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);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
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);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
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();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
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);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
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);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
到這裡一套適用於mvp
+RxRetrofit
的框架就運用而生了,當然你可以繼續新增功能,這裡只是簡單的給出使用的思路。
實現效果
終極封裝專欄
原始碼
建議
相關文章
- 深入淺出Java執行緒池:使用篇Java執行緒
- Flutter深入淺出元件篇---TabBarFlutter元件tabBar
- Flutter深入淺出元件篇---AppBarFlutter元件APP
- Flutter深入淺出元件篇---ScaffoldFlutter元件
- Flutter深入淺出元件篇---MaterialAppFlutter元件APP
- Flutter深入淺出元件篇---SizeBox、FittedBoxFlutter元件
- 深入淺出PyTorch(運算元篇)PyTorch
- Flutter深入淺出元件篇---Align、AnimatedAlignFlutter元件
- Flutter深入淺出元件篇---Padding、AnimatedPaddingFlutter元件padding
- 深入淺出開源效能測試工具 Locust (使用篇 2)
- Flutter深入淺出元件篇---ConstrainedBox、BoxConstraints、UnconstrainedBoxFlutter元件AI
- 深入淺出FE(十四)深入淺出websocketWeb
- 深入淺出 Golang 資源嵌入方案:前篇Golang
- Flutter深入淺出元件篇---繼承關係圖Flutter元件繼承
- 深入淺出Java執行緒池:原始碼篇Java執行緒原始碼
- 深入淺出解讀 Spring 原始碼:IOC/AOP 篇Spring原始碼
- 淺讀-《深入淺出Nodejs》NodeJS
- 深入淺出 RabbitMQMQ
- ArrayList 深入淺出
- 深入淺出——MVCMVC
- 深入淺出IO
- 深入淺出PromisePromise
- 深入淺出 ZooKeeper
- 深入淺出mongooseGo
- HTTP深入淺出HTTP
- 深入淺出decorator
- 深入淺出WebpackWeb
- 深入淺出HTTPHTTP
- mysqldump 深入淺出MySql
- Java開發工程師進階篇-深入淺出RedisJava工程師Redis
- 深入淺出 Golang 資源嵌入方案:go-bindata篇Golang
- SSL/TLS 深入淺出TLS
- Tomcat深入淺出(一)Tomcat
- 深入淺出 Laravel MacroableLaravelMac
- flutter ScopedModel深入淺出Flutter
- 反射的深入淺出反射
- 《深入淺出webpack》有感Web
- 深入淺出Spring MVCSpringMVC
- 深入淺出Spark JoinSpark