Retrofit的初次使用
rxretrofitlibrary是一个已经写好的网络框架库,先以本地Module导入到自己的项目中。
1、它的初始化操作大多在自定义的application中完成,如:
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
//初始化网络框架库
RxRetrofitApp.init(this,true);
}
}
2、在rxretrofitlibrary下定义一个回调信息统一封装类(即实际工作中网络请求的返回json实体类),泛型T表示用户真正关心的数据Data类,例如:
/**
* 回调信息统一封装类
*/
public class BaseResultEntity<T> {
// 判断标示
private int ret;
// 提示信息
private String msg;
//显示数据(用户需要关心的数据)
private T data; public String getMsg() {
return msg;
} public void setMsg(String msg) {
this.msg = msg;
} public T getData() {
return data;
} public void setData(T data) {
this.data = data;
} public int getRet() {
return ret;
} public void setRet(int ret) {
this.ret = ret;
}
}
3、在项目中使用GsonFormat插件快速创建简单的Data实体类
public class Data {
private String downurl;
private String icoUri;
private String name;
private String packageName;
public String getDownurl() {
return downurl;
}
public void setDownurl(String downurl) {
this.downurl = downurl;
}
public String getIcoUri() {
return icoUri;
}
public void setIcoUri(String icoUri) {
this.icoUri = icoUri;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPackageName() {
return packageName;
}
public void setPackageName(String packageName) {
this.packageName = packageName;
}
@Override
public String toString() {
return "name:"+name+",packageName:"+packageName ;
}
}
4、在项目下创建相应的网络请求接口(@GET注解后带的参数为网络请求url除BaseUrl部分,因为BaseUrl保存在了5中的请求同一封装类中,便于管理)
public interface HttpGetService {
@GET("url")
Observable<BaseResultEntity<Data>> getData();
}
5、为了使用方便,在rxretrofitlibrary下再定义一个请求统一封装类BaseApi,此处实现的Func1接口泛型为BaseResultEntity<T>, T。如果在实际项目中,是为了使用RxJava的map操作符将BaseResultEntity<T>转换为T。(转换的方法重点在代码最下面的call方法中,根据实际的业务逻辑来定)
/**
* 请求统一封装
* @param <T>
*/
public abstract class BaseApi<T> implements Func1<BaseResultEntity<T>, T>{
//rx生命周期管理
private SoftReference<RxAppCompatActivity> rxAppCompatActivity;
/*回调*/
private SoftReference<HttpOnNextListener> listener;
/*是否能取消加载框*/
private boolean cancel;
/*是否显示加载框*/
private boolean showProgress;
/*是否需要缓存处理*/
private boolean cache;
/*基础url*/
private String baseUrl = "http://192.168.0.101:8080/";
/*方法-如果需要缓存必须设置这个参数;不需要不用設置*/
private String mothed;
/*超时时间-默认6秒*/
private int connectionTime = 6;
/*有网情况下的本地缓存时间默认60秒*/
private int cookieNetWorkTime = 60;
/*无网络的情况下本地缓存时间默认30天*/
private int cookieNoNetWorkTime = 24 * 60 * 60 * 30;
/* 失败后retry次数*/
private int retryCount = 1;
/*失败后retry延迟*/
private long retryDelay = 100;
/*失败后retry叠加延迟*/
private long retryIncreaseDelay = 10; public BaseApi(HttpOnNextListener listener, RxAppCompatActivity rxAppCompatActivity) {
setListener(listener);
setRxAppCompatActivity(rxAppCompatActivity);
setShowProgress(false);
setCache(false); setCancel(true); setCookieNetWorkTime(60);
setCookieNoNetWorkTime(24*60*60);
} /**
* 设置参数
*
* @param retrofit
* @return
*/
public abstract Observable getObservable(Retrofit retrofit); public int getCookieNoNetWorkTime() {
return cookieNoNetWorkTime;
} public void setCookieNoNetWorkTime(int cookieNoNetWorkTime) {
this.cookieNoNetWorkTime = cookieNoNetWorkTime;
} public int getCookieNetWorkTime() {
return cookieNetWorkTime;
} public void setCookieNetWorkTime(int cookieNetWorkTime) {
this.cookieNetWorkTime = cookieNetWorkTime;
} public String getMothed() {
return mothed;
} public int getConnectionTime() {
return connectionTime;
} public void setConnectionTime(int connectionTime) {
this.connectionTime = connectionTime;
} public void setMothed(String mothed) {
this.mothed = mothed;
} public String getBaseUrl() {
return baseUrl;
} public void setBaseUrl(String baseUrl) {
this.baseUrl = baseUrl;
} public String getUrl() {
return baseUrl + mothed;
} public void setRxAppCompatActivity(RxAppCompatActivity rxAppCompatActivity) {
this.rxAppCompatActivity = new SoftReference(rxAppCompatActivity);
} public boolean isCache() {
return cache;
} public void setCache(boolean cache) {
this.cache = cache;
} public boolean isShowProgress() {
return showProgress;
} public void setShowProgress(boolean showProgress) {
this.showProgress = showProgress;
} public boolean isCancel() {
return cancel;
} public void setCancel(boolean cancel) {
this.cancel = cancel;
} public SoftReference<HttpOnNextListener> getListener() {
return listener;
} public void setListener(HttpOnNextListener listener) {
this.listener = new SoftReference(listener);
} public int getRetryCount() {
return retryCount;
} public void setRetryCount(int retryCount) {
this.retryCount = retryCount;
} public long getRetryDelay() {
return retryDelay;
} public void setRetryDelay(long retryDelay) {
this.retryDelay = retryDelay;
} public long getRetryIncreaseDelay() {
return retryIncreaseDelay;
} public void setRetryIncreaseDelay(long retryIncreaseDelay) {
this.retryIncreaseDelay = retryIncreaseDelay;
} /*
* 获取当前rx生命周期
* @return
*/
public RxAppCompatActivity getRxAppCompatActivity() {
return rxAppCompatActivity.get();
} @Override
public T call(BaseResultEntity<T> httpResult) {
//map 定义转换规则
if (httpResult.getRet() == 0) {//0失败,1成功
throw new HttpTimeException(httpResult.getMsg());
}
return httpResult.getData();
}
}
6、在项目下创建子类DataApi来继承5中的请求统一封装类
public class DataApi extends BaseApi<Data> {
public DataApi(HttpOnNextListener listener, RxAppCompatActivity rxAppCompatActivity) {
super(listener, rxAppCompatActivity);
//允许缓存
setCache(true);
//缓存的标志
setMothed("AppStore/test");
}
@Override
public Observable getObservable(Retrofit retrofit) {
HttpGetService httpGetService = retrofit.create(HttpGetService.class);
return httpGetService.getData();
}
}
7、最终在继承自RxAppCompatActivity(因为RxJava需要控制生命周期)的子Activity中调用来得到网络请求数据
DataApi api = new DataApi(new HttpOnNextListener<Data>() {
@Override
public void onNext(Data data) {
Log.i("MainActivity","onNext:"+data.toString()) ;
Log.i("MainActivity","downurl:"+data.getDownurl());
}
@Override
public void onCacheNext(String string) {
super.onCacheNext(string);
Log.i("MainActivity","onCache:"+string);
}
@Override
public void onError(Throwable e) {
super.onError(e);
}
},this);
HttpManager manager = HttpManager.getInstance();
//执行网络请求
manager.doHttpDeal(api);
Retrofit的初次使用的更多相关文章
- Android okHttp网络请求之Retrofit+Okhttp+RxJava组合
前言: 通过上面的学习,我们不难发现单纯使用okHttp来作为网络库还是多多少少有那么一点点不太方便,而且还需自己来管理接口,对于接口的使用的是哪种请求方式也不能一目了然,出于这个目的接下来学习一下R ...
- [旧][Android] Retrofit 初步使用
备注 原发表于2016.04.13,资料已过时,仅作备份,谨慎参考 Retrofit 是什么? Retrofit is a type-safe HTTP client for Android and ...
- 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~
一.写在前面 相信各位看官对retrofit和rxjava已经耳熟能详了,最近一直在学习retrofit+rxjava的各种封装姿势,也结合自己的理解,一步一步的做起来. 骚年,如果你还没有掌握ret ...
- Android Retrofit 2.0 使用-补充篇
推荐阅读,猛戳: 1.Android MVP 实例 2.Android Retrofit 2.0使用 3.RxJava 4.RxBus 5.Android MVP+Retrofit+RxJava实践小 ...
- Android MVP+Retrofit+RxJava实践小结
关于MVP.Retrofit.RxJava,之前已经分别做了分享,如果您还没有阅读过,可以猛戳: 1.Android MVP 实例 2.Android Retrofit 2.0使用 3.RxJava ...
- 快速Android开发系列网络篇之Retrofit
Retrofit是一个不错的网络请求库,用官方自己的介绍就是: A type-safe REST client for Android and Java 看官网的介绍用起来很省事,不过如果不了解它是怎 ...
- android快捷开发之Retrofit网络加载框架的简单使用
大家都知道,安卓最大的特点就是开源化,这自然会产生很多十分好用的第三方API,而基本每一个APP都会与网络操作和缓存处理机制打交道,当然,你可以自己通过HttpUrlConnection再通过返回数据 ...
- Retrofit结合RxJava使用指南
Retrofit结合RxJava使用指南 Retrofit是一个当前很流行的网络请求库, 官网的介绍是: "Type-safe HTTP client for Android and Jav ...
- 用Retrofit发送请求中添加身份验证
用Retrofit发送请求中添加身份验证====================在安卓应用开发中, retrofit可以极大的方便发送http网络请求,不管是GET, POST, 还是PUT, DEL ...
随机推荐
- springboot数据库连接池使用策略
springboot官方文档介绍数据库连接池的使用策略如下: Production database connections can also be auto-configured using a p ...
- 手动撸个Android雷达图(蜘蛛网图)RadarView
公司产品需要一个雷达图来展示各维度的比重,网上找了一波,学到不少,直接自己上手来撸一记 无图言虚空 简单分析一波,确定雷达图正几边形的--正五边形 int count=5,分为几个层数--4 层 in ...
- 常见性能优化策略的总结 good
阅读目录 代码 数据库 缓存 异步 NoSQL JVM调优 多线程与分布式 度量系统(监控.报警.服务依赖管理) 案例一:商家与控制区关系的刷新job 案例二:POI缓存设计与实现 案例三:业务运营后 ...
- python 基础语法学习
.注释 python单行注释以#开头 如:#!/usr/bin/env python3 #查找运行环境 多行注释有' ' '和" " " .python最具有特色的是使用 ...
- json数据取值
var data = JSON.parse(JSON.stringify(position, null, 4));
- 监听Web容器启动与关闭
在Servlet API 中有一个 ServletContextListener 接口,它能够监听 ServletContext 对象的生命周期,实际上就是监听 Web 应用的生命周期. 要监听web ...
- Mongodb数据更新命令、操作符
一.Mongodb数据更新命令 Mongodb更新有两个命令:update.save. 1.1update命令 update命令格式: db.collection.update(criteria,ob ...
- java.sql.SQLException: Incorrect string value: '\xE5\xBC\xA0\xE9\x9B\xB7' for column 'content' at row 1
这个问题主要是由于该字段及腹肌编码不正确导致的,一般新建的表如果没设置就会是latin1字符集需要将表改为utf8字符集,再将报错的列的字符集改为utf8即可,修改命令如下所示: ALTER TABL ...
- HEOI2018——welcome to NOI2018
我不得不和烈士和小丑走在同一道路上, 万人都要将火熄灭, 我一人独将此火高高举起, 我借此火得度一生的茫茫黑夜. ——海子 弹指一瞬间,翘首以盼的HEOI2018就来了. 我,一个滑稽的小丑,带 ...
- 【组合数学】Bzoj2916 [Poi1997]Monochromatic Triangles
Description 空间中有n个点,任意3个点不共线.每两个点用红线或者蓝线连接,如果一个三角形的三边颜色相同,那么称为同色三角形.给你一组数据,告诉你哪些点间有一条红线,计算同色三角形的总数. ...