1)配置

  1. dependencies{
  2. ...
  3. compile 'io.reactivex:rxjava:1.2.0'
  4. compile 'io.reactivex:rxandroid:1.2.1'
  5. compile 'com.squareup.retrofit2:retorfit:2.1.0'
  6. compile 'com.squareup.retrofit2:converter-gson:2.1.0'
  7. compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
  8. }

2)修改请求网络接口

Retrofit请求接口返回Call。若结合RxJava,则需要把Call改为Observable

  1. public interface IpServiceForPost{
  2. @FormUrlEncoded
  3. @POST("getIpInfo.php")
  4. Observable<IpModel> getIpMsg(@Field("ip") String first);
  5. }

3)修改请求网络方法

  1. private void postIpInformation(String ip){
  2. String url = "http://ip.taobao.com/service/";
  3. Retrofit retrofit = new Retrofit.Builder().baseUrl(url).addConverterFactory(GsonConverterFactory.create())
  4. .addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build();
  5. IpServiceForPost ipService = retrofit.create(IpServcieForPost.class);
  6. subscription=ipService.getIpMsg(ip).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
  7. .subscribe(new Subscriber<IpModel>(){
  8. @Override
  9. public void onCompleted(){
  10. Log.d(TAG,"onCompleted");
  11. }
  12. @Override
  13. public void onError(Throwable e){
  14. Log.d(TAG,"onError");
  15. }
  16. @Override
  17. public void onNext(IpModel ipModel){
  18. String country=ipModel.getData().getCountry();
  19. Toast.makeText(getApplicationContext(),country,Toast.LENGTH_SHORT).show();
  20. }
  21. });
  22. }

4)请求返回数据格式封装

  1. public class IpModel{
  2. private int code;
  3. private IpData data;
  4. public void setCode(int code){
  5. this.code = code;
  6. }
  7. public int getCode(){
  8. return this.code;
  9. }
  10. ...
  11. }
  1. public class HttpResult<T>{
  2. private int code;
  3. private T data;
  4. public int getCode(){
  5. return code;
  6. }
  7. public void setCode(int code){
  8. this.code = code;
  9. }
  10. public T getData(){
  11. return data;
  12. }
  13. public void setData(T data){
  14. this.data = data;
  15. }
  16. }
  1. public interface IpServiceForPost{
  2. @FormUrlEncoded
  3. @POST("getIpInfo.php")
  4. Observable<HttpResult<IpData>> getIpMsg(@Field("ip") String first);
  5. }
  1. private void postIpInformation(String ip){
  2. ...
  3. subscription=ipService.getIpMsg(ip).subscribeOn(Schedulers.io())
  4. .observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<HttpResult<IpData>>(){
  5. @Override
  6. public void onCompleted(){
  7. }
  8. @Override
  9. public void onError(Throwable e){
  10. }
  11. @Override
  12. public void onNext(HttpResult<IpData> ipDataHttpResult){
  13. IpData data=ipDataHttpResult.getData();
  14. Toast.matkText(getApplicationContext(),data.getCountry(),Toast.LENGTH_SHORT).show();
  15. }
  16. });
  17. }

5)取消请求

  1. @Override
  2. public void onStop(){
  3. super.onStop();
  4. if(subscription!=null && subscription.isUnsubscribed()){
  5. subscription.unsubscribe();
  6. }
  7. }
  1. private CompositeSubscription compositeSubscription = new CompositeSubscription();
  2. ...
  3. //发送请求的地方,将返回的subscription添加到compositeSubscription中
  4. compositeSubscription.add(subscription);
  5. ...
  6. //取消所有请求
  7. @Override
  8. public void onStop(){
  9. super.onStop();
  10. compositeSubscription.unsubscribe();
  11. }

《Android进阶之光》--RxJava结合Retrofit访问网络的更多相关文章

  1. 《Android进阶之光》--RxJava

    No1: RxJava使用 dependencies{ compile 'io.reactivex:rxjava:1.2.0' compile 'io.reactivex:rxandroid:1.2. ...

  2. [置顶] 曙光到来,我的新书《Android进阶之光》已出版

    独立博客版本请点击这里 由来 2016年我开始建立了自己的知识体系,所有的文章都是围绕着这个体系来写,随着这个体系的慢慢成长,开始有很多出版社联系我写书,因为比较看好电子工业出版社,就顺理成章的开始了 ...

  3. 《Android进阶之光》--注解与依赖注入框架

    No1: 标准注解: 1)@Override:覆写 2)@Deprecated:过时 3)@SuppressWarnings:取消警告 4)@SafeVarargs:申明使用了可变长度参数的方法 No ...

  4. 《Android进阶之光》--Material Design

    接上篇<Android进阶之光>--Android新特性 No1: 组件: 1)底部工作条-Bottom Sheets 2)卡片-Cards 3)提示框-Dialogs 4)菜单-Menu ...

  5. Android进阶之光-第1章-Android新特性-读书笔记

    第 1 章 Android 新特性 1.1 Android 5.0 新特性 1.1.1 Android 5.0 主要新特性 1. 全新的 Material Design 新风格 Material De ...

  6. Android O 可以上网 提示无法访问网络

    android O连接Wifi,可以上网,但是却提示无法访问网络,并且在wifi图标上有一个'x'. 从android N开始引入了监控机制,每次连接都会访问一下google的服务器,由于国内被墙,所 ...

  7. rxjava 调用retrofit执行网络请求的过程

    retrofit流程图 -1.RxJava调用Retrofit,从requestGtPushSaeUserInfo()中获得被观察者observable,然后new一个观察者向它订阅   0.从业务中 ...

  8. 《Android进阶之光》--网络编程与网络框架

    No1: Volley源码分析: Volley.newRequestQueue-> RequestQueue.start()-> CacheDispatcher.start()->C ...

  9. 《Android进阶之光》--RxJava实现RxBus

    事件总线RxBus,替代EventBus和otto 1)创建RxBus public class RxBus{ private static volatile RxBus rxBus; private ...

随机推荐

  1. android 基础题

    1. Android的四大组件是哪些,它们的作用? (1).Activity:Activity是Android程序与用户交互的窗口,是Android构造块中最基本的一种,它需要为保持各界面的状态,做很 ...

  2. 记一次Win Server 2012部署问题及解决方法

    1.前言 本章内容为在win server 2012服务器部署时遇到的问题及解决方法.大致工作为:两台服务器,一台web.一台数据库:web服务器部署.net web程序,数据库服务器安装oracle ...

  3. 用conda管理Python包

    用conda管理Python包 conda是一个很好的包管理工具,在用了Anaconda之后一直不知道怎么用conda进行管理,其实很简单,就是没人教,慢慢自己摸索了一点.直接在Anaconda的命令 ...

  4. bzoj 1803: Spoj1487 Query on a tree III(主席树)

    题意 你被给定一棵带点权的n个点的有根数,点从1到n编号. 定义查询 query(x,k): 寻找以x为根的k大点的编号(从小到大排序第k个点) 假设没有两个相同的点权. 输入格式: 第一行为整数n, ...

  5. Vue.js——循环(Java、JSTL标签库、数据库)

    一.Vue.js循环 Vue.js循环要使用 v-for 指令. v-for 指令需要以 student in StudentList 形式的特殊语法使用, StudentList 是源数据数组并且s ...

  6. Day4--------------对文件的权限管理

    一.文件权限 ls -l         显示当前文件详细信息 例: -rw-r--rwx.1 root root 1415 11月 9 20:21 anaconda-ks.cfg 依次顺序为:权限信 ...

  7. mysql 常用,使用经验

    mysql default  boolean字段 `enable` char(1) NOT NULL DEFAULT '1' COMMENT '启(禁)用',结果: this.enable ? &qu ...

  8. 关卡得分(if 嵌套for)与(for嵌套if)

  9. Github之协同开发

    一.协同开发 1.引子:假如三个人共同开发同一份代码,每个人都各自安排了任务,当每个人都完成了一半的时候,提交不提交呢? 要提交,提交到dev吗,都上传了一半,这样回家拿出来的代码根本跑不起来.所以, ...

  10. java util Aarrys 类

    toString方法  产生一维数组的二维版本 public static String toString(type[] a) { //type 是传入数据类型 if (a == null) retu ...