Retrofit & RxJava

关于如何使用Retrofit和RxJava请阅读参考中的两篇文章.

Retrofit处理数据

Retrofit是在什么时候处理从网络中获取到的json数据的呢? 我从几个使用了Retrofit的项目源代码寻找了半天, 也没有找到处理json的相关代码. 后来才发现, Retrofit中使用.addConverterFactory(GsonConverterFactory.create())其实就是自动添加了json解析, 它会将json数据直接转换为java类(即Pojo).

convertToPojo可以根据json的内容自动生成Pojo类.

以豆瓣api为例

json数据格式

豆瓣正在热映的json数据格式大致如下:

DoubanService.java

interface DoubanService {
@GET("/v2/movie/in_theaters")
Call<Douban> getList();
}

pojo类

public class Douban {
@SerializedName(value = "subjects")
private List<Subjects> subjects; ...Getter and Setter..
}

public class Subjects {
private String id;
private String title;
private Rating rating;
}
public class Rating {
private String min;
private String max;
private String stars; ...Getter and Setter..
}

处理并显示数据

public class DoubanRun extends Thread {
@Override
public void run() {
super.run();
Retrofit retrofit=new Retrofit.Builder()
.baseUrl("https://api.douban.com")
.addConverterFactory(GsonConverterFactory.create())
.build();
DoubanService douban=retrofit.create(DoubanService.class);
Call<Douban> call=douban.getList(); try {
Douban d=call.execute().body();
for (Subjects l:d.getSubjects()){
Log.i("TAGGGG",l.getId()+" "+l.getTitle());
}
} catch (IOException e) {
e.printStackTrace();
Log.i("TAGGGG","ff");
}
}
}

结果

26630781 我不是潘金莲
25726614 神奇动物在哪里
25793398 海洋奇缘
26365631 冲天火
26596486 名侦探柯南:纯黑的恶梦
3025375 奇异博士
26370431 夏威夷之恋
26673217 我是处女座
26696875 最萌身高差
25983044 比利·林恩的中场战事
22266320 深海浩劫
26876505 怨灵地下室
25921812 驴得水
26598021 航海王之黄
...

配合RxJava

DoubanService.java改为:

interface DoubanService {
@GET("/v2/movie/in_theaters")
Observable<Douban> getList();
}

DoubanRun改为:

public class DoubanRun extends Thread {

    @Override
public void run() {
super.run(); Retrofit retrofit=new Retrofit.Builder()
.baseUrl("https://api.douban.com")
.addConverterFactory(GsonConverterFactory.create())
//
.addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); DoubanService doubanService=retrofit.create(DoubanService.class); doubanService.getList()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Douban>() {
@Override
public void onCompleted() { } @Override
public void onError(Throwable e) { } @Override
public void onNext(Douban douban) {
for (Subjects l:douban.getSubjects()){
Log.i("TAGGGG",l.getId()+" "+l.getTitle()); }
}
});
}
}

注意点

  1. 出现Expected BEGIN_ARRAY but was BEGIN_OBJECT at或者pojo类中对应的变量的类型不对. 比如 如果在Subjects类中将rating设为String. 就会有Expected String but was BEGIN_OBJECT at...错误.

参考文章

  1. 给 Android 开发者的 RxJava 详解
    archive.org备份页面
  2. RxJava 与 Retrofit 结合的最佳实践
    archive.org备份页面

利用Retrofit, RxJava获取网络内容的更多相关文章

  1. kotlin for android----------MVP模式下(OKHttp和 Retrofit+RxJava)网络请求的两种实现方式

    今天要说的干货是:以Kotlin,在MVP模式下(OKHttp和 Retrofit+RxJava)网络请求两种实现方式的一个小案例,希望对大家有所帮助,效果图: Retrofit是Square公司开发 ...

  2. 一步步搭建Retrofit+RxJava+MVP网络请求框架(一)

    首先,展示一下封装好之后的项目的层级结构. 1.先创建一个RetrofitApiService.java package com.xdw.retrofitrxmvpdemo.http; import ...

  3. 一步步搭建Retrofit+RxJava+MVP网络请求框架(二),个人认为这次封装比较强大了

    在前面已经初步封装了一个MVP的网络请求框架,那只是个雏形,还有很多功能不完善,现在进一步进行封装.添加了网络请求时的等待框,retrofit中添加了日志打印拦截器,添加了token拦截器,并且对Da ...

  4. android开发学习 ------- Retrofit+Rxjava+MVP网络请求的实例

    http://www.jianshu.com/p/7b839b7c5884   推荐 ,照着这个敲完 , 测试成功 , 推荐大家都去看一下 . 下面贴一下我照着这个敲完的代码: Book实体类 - 用 ...

  5. asp.net 利用Response.Filter 获取输出内容, 变更输出内容

    重写 Response.Filter 就可以获取或更新输出到浏览器的内容       资料: https://weblog.west-wind.com/posts/2009/Nov/13/Captur ...

  6. 基于Retrofit+RxJava的Android分层网络请求框架

    目前已经有不少Android客户端在使用Retrofit+RxJava实现网络请求了,相比于xUtils,Volley等网络访问框架,其具有网络访问效率高(基于OkHttp).内存占用少.代码量小以及 ...

  7. 在retrofit+Rxjava中如何取得状态码非200(出现错误)时的response里的body

    一个典型的retrofit+Rxjava的网络请求如下 Subscription subscription = videoChartService.login(newBody) .observeOn( ...

  8. Retrofit + RxJava + OkHttp 让网络请求变的简单-基础篇

    https://www.jianshu.com/p/5bc866b9cbb9 最近因为手头上的工作做完了,比较闲,想着做一些优化.看到以前用的那一套网络框架添加一个请求比较麻烦,并且比较难用,所以想改 ...

  9. 结合Retrofit,RxJava,Okhttp,FastJson的网络框架RRO

    Retrofit以其灵活的调用形式, 强大的扩展性著称. 随着RxAndroid的推出, Retrofit这样的可插拔式的网络框架因其可以灵活兼容各种数据解析器, 回调形式(主要还是RxJava啦)而 ...

随机推荐

  1. 在Linux上安装多Jboss个需要修改的端口

    如果在一台机器上部署了多个jboss server,需要修改相关端口以避免端口冲突.目前确认需要修改的配置如下一.vi $JBOSS_HOME/server/default/conf/jboss-se ...

  2. 嵌入式 uboot以及kernel添加看门狗临时记录(个人记录未整理乱)

    Uboot_Kernerl_Add_Watch_Dog: U-Boot 2010.06 (Nov 01 2013 - 15:28:44) DRAM:  128 MiBCheck spi flash c ...

  3. hdu 4333(扩展kmp)

    题意:就是给你一个数字,然后把最后一个数字放到最前面去,经过几次变换后又回到原数字,问在这些数字中,比原数字小的,相等的,大的分别有多少个.比如341-->134-->413-->3 ...

  4. 怎样预防Ddos攻击

    一.为何要DDOS? 随着Internet互联网络带宽的增加和多种DDOS黑客工具的不断发布,DDOS拒绝服务攻击的实施越来越容易,DDOS攻击事件正在成上升趋势.出于商业竞争.打击报复和网络敲诈等多 ...

  5. [转]linux之less命令

    转自:http://www.cnblogs.com/peida/archive/2012/11/02/2750588.html less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux ...

  6. struts2类型转换与校验总结

    1.struts2的类型转换分为全部变量转变和局部变量转变. 2.struts2对8中常见的基本类型的属性变量,可以自动转换.如果是User对象,可以手动简历UserAction-coversion. ...

  7. js中DOM集合的动态特性

    先引出一个问题:通过调用getElements*()这样的方法返回来类(伪)数组,能对其本身的元素进行排序吗? 答案是不能,因为这些对象的都是NodeList . NamedNodeMap 或 HTM ...

  8. STL六大组件之——迭代器这个东西

    迭代器:除了在其它语言中司空见惯的下标法访问容器元素之外,C++语言提供了一种全新的方法——迭代器(iterator)来访问容器的元素.迭代器其实类似于引用,指向容器中某一元素.换个方式来说,容器就是 ...

  9. Matlab命令——目录操作(windows&Linux)

    Matlab命令——目录操作(windows&Linux) 1. filesep用于返回当前平台的目录分隔符,Windows是反斜杠(\),Linux是斜杠(/).有时此命令结合ispc命令使 ...

  10. 推荐一款C#反编译软件(开源)

    大二的时候老师要求做过一个小项目,大概4个人左右一组.当时交流不是特别到位,项目在一个同学的电脑上建成了就一直在他的电脑上(所以好东西不要烂在你的硬盘里),也不知道什么源码管理,可悲到项目做完我还没有 ...