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 ...
随机推荐
- Setting up Latex-vim (or Latex-suite) plugin within macVim under Mac OSX Yosemite 2015-1-20 by congliu
1. Overview: Vim是命令行下的文本编辑程序,gVim是Vim的Linux下的图形化版本,macVim是Mac下的图形化版本 Latex-vim是vim写Latex文件时的插件 Skim是 ...
- js基础--获取浏览器当前页面的滚动条高度的兼容写法
欢迎访问我的个人博客:http://www.xiaolongwu.cn 前言 在开发中,兼容性问题是最常见的,今天就来介绍一下关于获取滚动条高度的兼容性写法,宽度同理,我在这里就不一一解释了 各浏览器 ...
- python 匿名函数与三元运算
匿名函数 匿名函数就是不需要显示式的指定函数名 首先看一行代码: def calc(x,y): return x*y print(calc(2,3)) # 换成匿名函数 calc = lambda x ...
- RestTemplate的设置及使用
概述 RestTemplate是spring内置的http请求封装,在使用spring的情况下,http请求直接使用RestTemplate是不错的选择. Rest服务端 使用RestTemplate ...
- iOS 中判断应用程序是否为第一次打开
第一步:在AppDelegate中当应用启动完成后加入一下代码: - (BOOL)application:(UIApplication *)application didFinishLaunching ...
- 二十二、Hadoop学记笔记————Kafka 基础实战 :消费者和生产者实例
kafka的客户端也支持其他语言,这里主要介绍python和java的实现,这两门语言比较主流和热门 图中有四个分区,每个图形对应一个consumer,任意一对一即可 获取topic的分区数,每个分区 ...
- SSM-SpringMVC-21:SpringMVC中处理器方法之返回值Object篇
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 今天要记录的是处理方法,返回值为Object的那种,我给它分了一下类: 1.返回值为Object数值(例如1) ...
- InnoDB页压缩技术
Ⅰ.想起一个报错 1.1 创建表报错 (root@localhost) [(none)]> create tablespace ger_space add datafile 'ger_space ...
- An annotation based command line parser
Java命令行选项解析之Commons-CLI & Args4J & JCommander http://rensanning.iteye.com/blog/2161201 JComm ...
- 深入Spring Boot:那些注入不了的Spring占位符(${}表达式)
Spring里的占位符 spring里的占位符通常表现的形式是: <bean id="dataSource" destroy-method="close" ...