Retrofit+MVP框架封装记录篇
当下最流行的网络请求组合,retrofit2+okhttp+rxjava+mvp

这里是封装记录篇
首先分模块,比如登录

先来说封装后的使用
package com.fragmentapp.login.presenter; import android.util.Log; import com.fragmentapp.base.BasePresenter;
import com.fragmentapp.http.BaseObserver;
import com.fragmentapp.http.BaseResponses;
import com.fragmentapp.login.bean.LoginDataBean;
import com.fragmentapp.login.imple.ILoginModel;
import com.fragmentapp.login.imple.ILoginView;
import com.fragmentapp.login.model.LoginModel; /**
* Created by liuzhen on 2017/11/3.
*/ public class LoginPresenter extends BasePresenter { private ILoginView view;
private ILoginModel model; public LoginPresenter(ILoginView view){
this.view = view;
model = new LoginModel();
} public void login(String username,String pwd){
model.login(observer,username,pwd);
} BaseObserver<BaseResponses<LoginDataBean>> observer = new BaseObserver<BaseResponses<LoginDataBean>>(){ @Override
public void onNextResponse(BaseResponses<LoginDataBean> loginDataBean) {
Log.e("token",loginDataBean.getData().getHCACCESSTOKEN()+"");
view.success(loginDataBean.getData());
} @Override
public void onErrorResponse(BaseResponses<LoginDataBean> loginDataBean) {
view.error();
} @Override
public void onNetWorkError(String val) {
view.error();
}
}; }
Presenter
通过p层的接口来交互,model去访问网络请求,然后返回结果回调返回到view层去刷新
这里自定义了一个base的obsever类,避免多次的传递接口

model则负责调用网络请求了
package com.fragmentapp.login.model; import com.fragmentapp.http.BaseObserver;
import com.fragmentapp.http.BaseResponses;
import com.fragmentapp.http.RetrofitHelper;
import com.fragmentapp.login.bean.LoginDataBean;
import com.fragmentapp.login.imple.ILoginModel; import java.util.HashMap;
import java.util.Map; import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers; /**
* Created by liuzhen on 2017/11/7.
*/ public class LoginModel implements ILoginModel { @Override
public void login(final BaseObserver<BaseResponses<LoginDataBean>> observer,String username,String pwd) {
Map<String, String> map = new HashMap<>();
map.put("account[username]", username);
map.put("account[password]", pwd);
RetrofitHelper.getInstance().getService()
.login(map)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
} }
view层的回调也只有两个接口,可以根据自己的需求添加
package com.fragmentapp.login.imple; import com.fragmentapp.login.bean.LoginDataBean; /**
* Created by liuzhen on 2017/11/6.
*/ public interface ILoginView { void success(LoginDataBean dataBean);
void error(); }

访问网络后直接在activity里处理回调的结果刷新界面等
这里的retrofit的访问url是用的添加头部tag来达到动态访问替换baseurl的目的

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

然后observable套用了一层类型,这里主要是后台数据格式吭,可以去掉
package com.fragmentapp.http; /**
* Created by liuzhen on 2017/11/3.
*/ public class BaseResponses<T> { private String info;
private int status;
private T data; public String getInfo() {
return info;
} public void setInfo(String info) {
this.info = info;
} public int getStatus() {
return status;
} public void setStatus(int status) {
this.status = status;
} public T getData() {
return data;
} public void setData(T data) {
this.data = data;
}
}
然后是base的observer类,在里面根据自己的业务去回调自定义的接口,这样就不用每次重载这么多的方法了
package com.fragmentapp.http; import android.os.Looper;
import android.util.Log; import io.reactivex.Observer;
import io.reactivex.disposables.Disposable; /**
* Created by liuzhen on 2017/11/3.
*/ public abstract class BaseObserver<T extends BaseResponses> implements Observer<T> {
String TAG = getClass().getSimpleName(); @Override
public void onSubscribe(Disposable d) {
Log.e(TAG, "onSubscribe");
} @Override
public void onNext(T t) {
Log.e(TAG, "onNext"+t);
if (t.getStatus() == 200) {
onNextResponse(t);
} else {
Log.e(TAG, "ErrorStatus:" + t.getStatus() + "ErrorInfo" + t.getInfo());
onErrorResponse(t);
}
} @Override
public void onError(Throwable e) {
Log.e(TAG, "onError" + e.toString());
onNetWorkError("onError 网络超时,请重新尝试--"+e.getMessage());
if (Looper.myLooper() == null) {
Looper.prepare();
Log.e(TAG,"onError 网络超时,请重新尝试");
Looper.loop();
} } @Override
public void onComplete() {
Log.e(TAG, "onComplete");
} /**返回成功*/
public abstract void onNextResponse(T t);
/**接口失败信息*/
public abstract void onErrorResponse(T t);
/**网络错误*/
public abstract void onNetWorkError(String val);
}


这个没啥好说的了
封装好了添加东西也就方便许多了,前面的工作不就是为了后期的迭代方便吗
比如添加一个dialog加载框,首先先添加两个回调方法

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

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

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

效果如下图

GitHub:https://github.com/1024477951/FragmentApp
Retrofit+MVP框架封装记录篇的更多相关文章
- 开发 Material Design+RxJava+Retrofit+MVP App 参考资料
前言 在开发一个基于 Material Design+RxJava+Retrofit+MVP 框架的 App 过程中学习的资料整理 —— 由G军仔分享 这里记录了我开发 大象 项目时,所学习的 ...
- 带你封装自己的MVP+Retrofit+RxJava2框架(一)
前言 文本已经收录到我的Github个人博客,欢迎大佬们光临寒舍:我的GIthub博客 看完本篇文章的,可以看下带你封装自己的MVP+Retrofit+RxJava2框架(二),里面封装得到了改进 本 ...
- 【腾讯Bugly干货分享】一步一步实现Android的MVP框架
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/5799d7844bef22a823b3ad44 内容大纲: Android 开发 ...
- Laravel 和 Spring Boot 两个框架比较创业篇(二:人工成本)
前面从开发效率比较了 Laravel 和 Spring Boot两个框架,见:Laravel 和 Spring Boot 两个框架比较创业篇(一:开发效率) ,这一篇打算比较一下人工成本. 本文说的人 ...
- 用ladon框架封装Python为Webservice接口以及调用接口的方法
一.用ladon框架封装Python为Webservice接口 功能实现的同时,希望将接口开放给别人,而封装python接口的一个再简单不过的框架Ladon,而且提供不同的协议,包括SOAP和Json ...
- 180723-Quick-Task 动态脚本支持框架之结构设计篇
文章链接:https://liuyueyi.github.io/hexblog/2018/07/23/180723-Quick-Task-动态脚本支持框架之结构设计篇/ Quick-Task 动态脚本 ...
- 玩转OneNET物联网平台之MQTT服务⑤ —— OneNet智能灯+MVP框架
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- ABP框架实践基础篇之开发UI层
返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 说明 其实最开始写的,就是这个ABP框架实践基础篇.在写这篇博客之前,又回头复习了一下ABP框架的理论,如果你还没学习,请查看AB ...
- Magicodes.WeiChat——后台JS框架封装
Magicodes.WeiChat同时也致力于提高后台开发效率,因此对在后台前端这块也做了一定的封装.我们先来说说主要的框架JS——mwc.js和mwc_elements.js.这两个JS文件位于Sc ...
随机推荐
- springbatch的封装与使用
springbatch 主要实现批量数据的处理,我对batch进行的封装,提出了jobBase类型,具体job需要实现它即可.Spring Batch 不仅提供了统一的读写接口.丰富的任务处理方式.灵 ...
- 面试挂在了 LRU 缓存算法设计上
好吧,有人可能觉得我标题党了,但我想告诉你们的是,前阵子面试确实挂在了 RLU 缓存算法的设计上了.当时做题的时候,自己想的太多了,感觉设计一个 LRU(Least recently used) 缓存 ...
- CopyOnWriteArrayList你都不知道,怎么拿offer?
前言 只有光头才能变强 前一阵子写过一篇COW(Copy On Write)文章,结果阅读量很低啊...COW奶牛!Copy On Write机制了解一下 可能大家对这个技术比较陌生吧,但这项技术是挺 ...
- C语言超级搞笑的代码,冷笑话我们程序员也会讲的啊!
百年修得足下点击本文 欢迎来到"C语言基础"专题,今天我们放松一天,不学习知识,来看下大千世界的千奇百怪的C语言代码,你见过那些? 1.关于随机数这回事 这个随机数有点意思哦. 2 ...
- osi参考模型(开放系统互连参考模型)
自互联网诞生以来,随着网络飞速发展,用户迫切要求能在不同体系结构的网络空间交换信息,使得不同的网络能够互联起来. 国际化标准组织(International Organization for Stan ...
- ceph 高级运维
追查系统故障,需要找到问题的根源安置组和相关的OSD. 一般来说,归置组卡住时 ceph 的自修复功能往往无能为力,卡住的状态细分为: 1. unclean 不干净:归置组里有些对象的复制数未达到期望 ...
- 【死磕 Spring】----- IOC 之 注册 BeanDefinition
原文出自:http://cmsblogs.com 获取 Document 对象后,会根据该对象和 Resource 资源对象调用 registerBeanDefinitions() 方法,开始注册 B ...
- IM开发者的零基础通信技术入门(一):通信交换技术的百年发展史(上)
[来源申明]本文原文来自:微信公众号“鲜枣课堂”,官方网站:xzclass.com,原题为:<通信交换的百年沧桑(上)>,本文引用时已征得原作者同意.为了更好的内容呈现,即时通讯网在收录时 ...
- js原生数组去重
// ['c', 'a', 'z', 'a', 'x', 'a', 'x', 'c', 'b']; 取消重复的元素 数组去重 (for循环) // 把旧数组里面 不重复的元素选取出来放到新数组中 重复 ...
- 清除过期日志的py脚本
本篇和大家分享的是一个清除过期日志的python脚本,年后第二篇希望对大家有帮助: 该python脚本创建的由来 代码及分析 crontab定时任务 该python脚本创建的由来 此由来,是在过年假期 ...