当下最流行的网络请求组合,retrofit2+okhttp+rxjava+mvp

这里是封装记录篇

首先分模块,比如登录

先来说封装后的使用

  1. package com.fragmentapp.login.presenter;
  2.  
  3. import android.util.Log;
  4.  
  5. import com.fragmentapp.base.BasePresenter;
  6. import com.fragmentapp.http.BaseObserver;
  7. import com.fragmentapp.http.BaseResponses;
  8. import com.fragmentapp.login.bean.LoginDataBean;
  9. import com.fragmentapp.login.imple.ILoginModel;
  10. import com.fragmentapp.login.imple.ILoginView;
  11. import com.fragmentapp.login.model.LoginModel;
  12.  
  13. /**
  14. * Created by liuzhen on 2017/11/3.
  15. */
  16.  
  17. public class LoginPresenter extends BasePresenter {
  18.  
  19. private ILoginView view;
  20. private ILoginModel model;
  21.  
  22. public LoginPresenter(ILoginView view){
  23. this.view = view;
  24. model = new LoginModel();
  25. }
  26.  
  27. public void login(String username,String pwd){
  28. model.login(observer,username,pwd);
  29. }
  30.  
  31. BaseObserver<BaseResponses<LoginDataBean>> observer = new BaseObserver<BaseResponses<LoginDataBean>>(){
  32.  
  33. @Override
  34. public void onNextResponse(BaseResponses<LoginDataBean> loginDataBean) {
  35. Log.e("token",loginDataBean.getData().getHCACCESSTOKEN()+"");
  36. view.success(loginDataBean.getData());
  37. }
  38.  
  39. @Override
  40. public void onErrorResponse(BaseResponses<LoginDataBean> loginDataBean) {
  41. view.error();
  42. }
  43.  
  44. @Override
  45. public void onNetWorkError(String val) {
  46. view.error();
  47. }
  48. };
  49.  
  50. }

Presenter

通过p层的接口来交互,model去访问网络请求,然后返回结果回调返回到view层去刷新

这里自定义了一个base的obsever类,避免多次的传递接口

model则负责调用网络请求了

  1. package com.fragmentapp.login.model;
  2.  
  3. import com.fragmentapp.http.BaseObserver;
  4. import com.fragmentapp.http.BaseResponses;
  5. import com.fragmentapp.http.RetrofitHelper;
  6. import com.fragmentapp.login.bean.LoginDataBean;
  7. import com.fragmentapp.login.imple.ILoginModel;
  8.  
  9. import java.util.HashMap;
  10. import java.util.Map;
  11.  
  12. import io.reactivex.android.schedulers.AndroidSchedulers;
  13. import io.reactivex.schedulers.Schedulers;
  14.  
  15. /**
  16. * Created by liuzhen on 2017/11/7.
  17. */
  18.  
  19. public class LoginModel implements ILoginModel {
  20.  
  21. @Override
  22. public void login(final BaseObserver<BaseResponses<LoginDataBean>> observer,String username,String pwd) {
  23. Map<String, String> map = new HashMap<>();
  24. map.put("account[username]", username);
  25. map.put("account[password]", pwd);
  26. RetrofitHelper.getInstance().getService()
  27. .login(map)
  28. .subscribeOn(Schedulers.io())
  29. .observeOn(AndroidSchedulers.mainThread())
  30. .subscribe(observer);
  31. }
  32.  
  33. }

view层的回调也只有两个接口,可以根据自己的需求添加

  1. package com.fragmentapp.login.imple;
  2.  
  3. import com.fragmentapp.login.bean.LoginDataBean;
  4.  
  5. /**
  6. * Created by liuzhen on 2017/11/6.
  7. */
  8.  
  9. public interface ILoginView {
  10.  
  11. void success(LoginDataBean dataBean);
  12. void error();
  13.  
  14. }

访问网络后直接在activity里处理回调的结果刷新界面等

这里的retrofit的访问url是用的添加头部tag来达到动态访问替换baseurl的目的

然后接口参数采用map的方式添加,个人感觉一个个分开来跟烦,每次都得改service类

然后observable套用了一层类型,这里主要是后台数据格式吭,可以去掉

  1. package com.fragmentapp.http;
  2.  
  3. /**
  4. * Created by liuzhen on 2017/11/3.
  5. */
  6.  
  7. public class BaseResponses<T> {
  8.  
  9. private String info;
  10. private int status;
  11. private T data;
  12.  
  13. public String getInfo() {
  14. return info;
  15. }
  16.  
  17. public void setInfo(String info) {
  18. this.info = info;
  19. }
  20.  
  21. public int getStatus() {
  22. return status;
  23. }
  24.  
  25. public void setStatus(int status) {
  26. this.status = status;
  27. }
  28.  
  29. public T getData() {
  30. return data;
  31. }
  32.  
  33. public void setData(T data) {
  34. this.data = data;
  35. }
  36. }

然后是base的observer类,在里面根据自己的业务去回调自定义的接口,这样就不用每次重载这么多的方法了

  1. package com.fragmentapp.http;
  2.  
  3. import android.os.Looper;
  4. import android.util.Log;
  5.  
  6. import io.reactivex.Observer;
  7. import io.reactivex.disposables.Disposable;
  8.  
  9. /**
  10. * Created by liuzhen on 2017/11/3.
  11. */
  12.  
  13. public abstract class BaseObserver<T extends BaseResponses> implements Observer<T> {
  14. String TAG = getClass().getSimpleName();
  15.  
  16. @Override
  17. public void onSubscribe(Disposable d) {
  18. Log.e(TAG, "onSubscribe");
  19. }
  20.  
  21. @Override
  22. public void onNext(T t) {
  23. Log.e(TAG, "onNext"+t);
  24. if (t.getStatus() == 200) {
  25. onNextResponse(t);
  26. } else {
  27. Log.e(TAG, "ErrorStatus:" + t.getStatus() + "ErrorInfo" + t.getInfo());
  28. onErrorResponse(t);
  29. }
  30. }
  31.  
  32. @Override
  33. public void onError(Throwable e) {
  34. Log.e(TAG, "onError" + e.toString());
  35. onNetWorkError("onError 网络超时,请重新尝试--"+e.getMessage());
  36. if (Looper.myLooper() == null) {
  37. Looper.prepare();
  38. Log.e(TAG,"onError 网络超时,请重新尝试");
  39. Looper.loop();
  40. }
  41.  
  42. }
  43.  
  44. @Override
  45. public void onComplete() {
  46. Log.e(TAG, "onComplete");
  47. }
  48.  
  49. /**返回成功*/
  50. public abstract void onNextResponse(T t);
  51. /**接口失败信息*/
  52. public abstract void onErrorResponse(T t);
  53. /**网络错误*/
  54. public abstract void onNetWorkError(String val);
  55. }

这个没啥好说的了

封装好了添加东西也就方便许多了,前面的工作不就是为了后期的迭代方便吗

比如添加一个dialog加载框,首先先添加两个回调方法

然后统一在observer里调用接口方法

只需要在presenter层的回调的统一调用就行了,在view层完全不用理会,而且逻辑的控制也能很好的添加,然后在view层实现方法,在方法里去调用dialog的show方法

至于这里的dialog是自己自定义了一个简单的progress控件,然后在base里面去操作的,这样在view加载的时候直接调用方法就行了,这里是和空页面一起操作的,空页面有专门写,在上一篇

效果如下图

GitHub:https://github.com/1024477951/FragmentApp

Retrofit+MVP框架封装记录篇的更多相关文章

  1. 开发 Material Design+RxJava+Retrofit+MVP App 参考资料

    前言     在开发一个基于 Material Design+RxJava+Retrofit+MVP 框架的 App 过程中学习的资料整理 —— 由G军仔分享 这里记录了我开发 大象 项目时,所学习的 ...

  2. 带你封装自己的MVP+Retrofit+RxJava2框架(一)

    前言 文本已经收录到我的Github个人博客,欢迎大佬们光临寒舍:我的GIthub博客 看完本篇文章的,可以看下带你封装自己的MVP+Retrofit+RxJava2框架(二),里面封装得到了改进 本 ...

  3. 【腾讯Bugly干货分享】一步一步实现Android的MVP框架

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/5799d7844bef22a823b3ad44 内容大纲: Android 开发 ...

  4. Laravel 和 Spring Boot 两个框架比较创业篇(二:人工成本)

    前面从开发效率比较了 Laravel 和 Spring Boot两个框架,见:Laravel 和 Spring Boot 两个框架比较创业篇(一:开发效率) ,这一篇打算比较一下人工成本. 本文说的人 ...

  5. 用ladon框架封装Python为Webservice接口以及调用接口的方法

    一.用ladon框架封装Python为Webservice接口 功能实现的同时,希望将接口开放给别人,而封装python接口的一个再简单不过的框架Ladon,而且提供不同的协议,包括SOAP和Json ...

  6. 180723-Quick-Task 动态脚本支持框架之结构设计篇

    文章链接:https://liuyueyi.github.io/hexblog/2018/07/23/180723-Quick-Task-动态脚本支持框架之结构设计篇/ Quick-Task 动态脚本 ...

  7. 玩转OneNET物联网平台之MQTT服务⑤ —— OneNet智能灯+MVP框架

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  8. ABP框架实践基础篇之开发UI层

    返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 说明 其实最开始写的,就是这个ABP框架实践基础篇.在写这篇博客之前,又回头复习了一下ABP框架的理论,如果你还没学习,请查看AB ...

  9. Magicodes.WeiChat——后台JS框架封装

    Magicodes.WeiChat同时也致力于提高后台开发效率,因此对在后台前端这块也做了一定的封装.我们先来说说主要的框架JS——mwc.js和mwc_elements.js.这两个JS文件位于Sc ...

随机推荐

  1. python——矩阵的奇异值分解,对图像进行SVD

    矩阵SVD 奇异值分解(Singular Value Decomposition)是一种重要的矩阵分解方法,可以看做是对方阵在任意矩阵上的推广.Singular的意思是突出的,奇特的,非凡的,按照这样 ...

  2. (leetcode:选择不相邻元素,求和最大问题):打家劫舍(DP:198/213/337)

    题型:从数组中选择不相邻元素,求和最大 (1)对于数组中的每个元素,都存在两种可能性:(1)选择(2)不选择,所以对于这类问题,暴力方法(递归思路)的时间复杂度为:O(2^n): (2)递归思路中往往 ...

  3. 从On-Premise本地到On-Cloud云上运维的演进

    摘要: 从用户的声音中,我们听到用户对稳定.弹性.透明的诉求,我们也在不断升级ECS的运维能力和体验,助力用户建立主动运维体系,赋能业务永续运行.为了让大家更好的了解和用好ECS弹性计算服务,从本期开 ...

  4. 关于php-fpm比较重要的几个参数

    pm.max_children 设置多大合适? php-fpm.conf有两个至关重要的参数: 一个是”max_children”,另一个是”request_terminate_timeout”. p ...

  5. ["1", "2", "3"].map(parseInt)`返回的结果是[1,2,3]?

    今天刷到一道面试题,["1", "2", "3"].map(parseInt)返回的结果是什么呢?可能大家第一个想到的是 [1,2,3],但 ...

  6. 用CSS画一个带阴影的三角形的示例代码

    1. 思路 怎么用CSS3画一个带阴影的三角形呢 ? 有童鞋说, 这还不简单吗 网上有很多解决方案, 但其实大多都是实现不太完美的, 存在一些问题 假设我们做一个向下的三角形箭头 常见的方法大致有两种 ...

  7. arcgis api 3.x for js 入门开发系列二十二地图模态层(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  8. nn.ConvTranspose2d的参数output_padding的作用

    参考:https://blog.csdn.net/qq_41368247/article/details/86626446 使用前提:stride > 1 补充:same卷积操作 是通过padd ...

  9. 如何用人工的方式将Excel里的一堆数字变成一个数组

    目的是抛砖引玉,有谁可以教教我如何吧Excle的数据导入MyEclipse么? 如果只有⑨个字符的话我肯定是直接人工输入的,然而这次有65536行乘以3组,遭不住啊. 一.数组之间要有逗号在B列右键, ...

  10. 缓存穿透,缓存雪崩,热点key及解决办法

    1.穿透 穿透:频繁查询一个不存在的数据,由于缓存不命中,每次都要查询持久层.从而失去缓存的意义. 解决办法: 持久层查询不到就缓存空结果,查询时先判断缓存中是否exists(key) ,如果有直接返 ...