RxJava+Retrofit+OkHttp深入浅出-mvp(使用篇)
2016-12-26 15:19
417 查看
RxJava+Retrofit+OkHttp深入浅出-mvp(使用篇)
背景
RxJava+Retrofit+OkHttp封装系列也基本完成了,功能无太大迭代的需要,但是最近
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群告诉我!相关文章推荐
- RxJava+Retrofit+OkHttp深入浅出-mvp(使用篇)
- Okhttp+Retrofit+Rxjava+MVP联合使用
- [置顶] OKhttp、RXjava与retrofit的网络访问使用
- MVP+Retrofit+RxJava组合使用
- 使用rxjava,retrofit,okhttp实现mvp模式的数据解析
- RxJava+Retrofit+OkHttp深入浅出-终极封装六特殊篇(变种String替换Gson自由扩展)
- RxJava+Retrofit+OkHttp深入浅出-终极封装二(网络请求)
- 进阶之路:MVP+Retrofit+RxJava组合使用
- Android中的RxJava,Retrofit,MVP的使用
- 网络请求框架 Rxjava+ReTrofit+okHttp+MVP
- RxJava+okhttp+Retrofit+Mvp 的封装
- RxJava+Retrofit+OkHttp深入浅出-终极封装五(数据持久化)
- RxJava+Retrofit+OkHttp深入浅出-终极封装三(文件上传)
- Rxjava+ReTrofit+okHttp深入浅出-终极封装
- Android中的Retrofit+OkHttp+RxJava缓存架构使用
- 设计模式笔记之四:MVP+Retrofit+RxJava组合使用
- Rxjava+ReTrofit+okHttp深入浅出-终极封装三(文件上传)
- Material Design 风格 结合使用 Retrofit RxJava Jsoup Mvp 模式的一款资讯类 学习 app
- RxJava+Retrofit+OkHttp深入浅出-终极封装三(文件上传)
- RxJava+Retrofit+OkHttp 懒人方式使用一