您的位置:首页 > 理论基础 > 计算机网络

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

2016-12-26 15:19 417 查看

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深入浅出-终极封装专栏)

源码

传送门-下载封装源码

建议

如果你对这套封装有任何的问题和建议欢迎加入QQ群告诉我!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: