最近在想能不能把之前项目里的网络请求改下

想通过Retrofit重构下,因为Retrofit完美兼容Rxjava后面会用到Rxjava

所以

开个坑写点

由于网上Retrofit 2.0的架构介绍很详细。所以我这里只提供我遇到的一些问题和解决的方法

先要依赖

compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'

  

然后,首先要使用Retrofit进行网络请求,你必须建立一个请求接口类 ApiService

public interface ApiService {
/* @GET("service/getIpInfo.php")
Call<GetIpInfoResponse> getIpInfo(@Query("ip") String ip);*/ @GET("service/getIpInfo.php")
Observable<GetIpInfoResponse> getIpInfo(@Query("ip") String ip);
}

对于上面的代码他分两部分,总的来说

第一部分@  他采用注解的方式,@表明你所要使用的网络请求。比如我上面用的是Get请求我就@GET 然后后面需要带请求URL的一部分

   然后问题来了,我这个URL要放哪一部分呢。根据我的查证,①你可以全部放一个完整的请求URL地址,这种情况当你在下面建立Retrofit实例类的时候他的.baseUrl(“yourURL”)这个方法里面的URL串就会没有作用;

                              ②你放地址的一部分,但是要保证建立Retrofit类的.baseUrl(“yourURL”)这个你的URL要和你在上面方法里放一部分地址连接起来他们能成为一个合法的

                              完整URL地址。而且,你还要满足在使用.baseUrl()方法的时候,你的这个Url参数要是以 / 结尾的地址!

Ps:对于多个请求参数的写法

  

    @POST("server?")
Call<GetLoginJson> Login(@Query("command") String login,
@Query("posModel") String posModel,
@Query("posSn") String posSn,
@Query("posMac") String posMac,
@Query("userId") String userId,
@Query("passWord") String passWord,
@Query("Version") String Version};

第二部分 就是下面接口给外部提供的方法 这个方法也分为两种写法,第一种写法是返回为Call类型回调,我们看代码(注:这个Call回调的方法和上面注释的接口对应)

  

Retrofit mRetrofit = new Retrofit.Builder() //Retrofit采用典型的Builder模式
.baseUrl("http://ip.taobao.com")  //接着写入你的URl地址
   .addConverterFactory(GsonConverterFactory.create()) // 新建一个Gson转换器
     .build(); ApiService apiService = retrofit.create(ApiService.class); //实例化ApisService       Call<GetIpInfoResponse> call = apiService.getIpInfo("63.223.108.42");  //调用接口方法      /**将call接入线程队列中,然后实例化他的callBacl*/
call.enqueue(new Callback<GetIpInfoResponse>() {
@Override
public void onResponse(Response<GetIpInfoResponse> response, Retrofit retrofit) {
GetIpInfoResponse getIpInfoResponse = response.body(); //将返回的数据取出,赋值给返回接收类中(这个下面讲)
mTvContent.setText(getIpInfoResponse.data.country);
} @Override
public void onFailure(Throwable t) {
mTvContent.setText(t.getMessage());
}
});

以上代码就是Retrofit的完整的使用流程,看完之后你就会发现我有一个类没有贴出,那就是GetIpInfoResponse

为什么会有这个类呢,这个类是为了和通信成功后返回了成功值做匹配,返回的数据和他是有关系的,而且他的参数和写法是由返回值决定的。我们来看下代码

public class GetIpInfoResponse extends BaseResponse {
public IpInfo data;
} public class IpInfo {
public String country;
public String country_id;
public String area;
public String area_id;
public String ip;
}

我们可以将上面的URl输入到网址看看返回的是什么,http://ip.taobao.com/service/getIpInfo.php ; 但是如果没错应该是{"code":1,"data":"no ip param."},这个没有数据返回应该是和没有在手持机上测试有关系

所以他的返回类参数就是Json返回的参数,所以这里的data就对应返回关键字为 data 的数据,而这个数据的数据参数如IpInfo这个类,至此Retrofit的使用差不多就这么多;(应该没什么遗漏吧)

然后下面是和Rxjava一起使用的情况 Retrofit他的使用(注:和Rxjava的时候ApiService为第二个未注释的方法,我这里偷懒了两个都放在一个文件里)

        Retrofit retrofit = new Retrofit.Builder()
.baseUrl(“youUrl”)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
ApiService apiService = retrofit.create(ApiService.class);
apiService.getIpInfo("63.223.108.42")
.subscribeOn(Schedulers .io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<GetIpInfoResponse>() {
@Override
public void onCompleted() { } @Override
public void onError(Throwable e) {
mTvContent.setText(e.getMessage());
} @Override
public void onNext(GetIpInfoResponse getIpInfoResponse) {
mTvContent.setText(getIpInfoResponse.data.country);
}
});

对于和Rxjava联合使用的好处,那就是我们可以很方便的控制线程开关

然后使用Retrofit可以使逻辑更加清晰,代码更加简洁和Rxjava联合使用减少了很多秘制缩进的问题

Retrofit 2.0使用的更多相关文章

  1. Android Retrofit 2.0 使用-补充篇

    推荐阅读,猛戳: 1.Android MVP 实例 2.Android Retrofit 2.0使用 3.RxJava 4.RxBus 5.Android MVP+Retrofit+RxJava实践小 ...

  2. Retrofit 2.0 超能实践(四),完成大文件断点下载

    作者:码小白 文/CSDN 博客 本文出自:http://blog.csdn.net/sk719887916/article/details/51988507 码小白 通过前几篇系统的介绍和综合运用, ...

  3. Retrofit 2.0 超能实践(三),轻松实现文件/多图片上传/Json字符串

    文:http://blog.csdn.net/sk719887916/article/details/51755427 Tamic 简书&csdn同步 通过前两篇姿势的入门 Retrofit ...

  4. Retrofit 2.0 超能实践(一),okHttp完美支持Https传输

    http: //blog.csdn.net/sk719887916/article/details/51597816 Tamic首发 前阵子看到圈子里Retrofit 2.0,RxJava(Andro ...

  5. Retrofit 2.0 超能实践,完美支持Https传输

    http://blog.csdn.NET/sk719887916/article/details/51597816 前阵子看到圈子里Retrofit 2.0,RxJava(Android), OkHt ...

  6. android -------- Retrofit + RxJava2.0 + Kotlin + MVP 开发的 WanAndroid 项目

    简介 wanandroid项目基于 Retrofit + RxJava2.0 + Kotlin + MVP 用到的依赖 implementation 'io.reactivex.rxjava2:rxj ...

  7. Retrofit 2.0基于OKHttp更高效更快的网络框架 以及自定义转换器

    时间关系,本文就 Retrofit 2.0的简单使用 做讲解  至于原理以后有空再去分析 项目全面.简单.易懂  地址: 关于Retrofit 2.0的简单使用如下:  https://gitee.c ...

  8. Android Retrofit 2.0使用

    实例带你了解Retrofit 2.0的使用,分享目前开发Retrofit遇到的坑和心得. 添加依赖 app/build.gradle 1 compile 'com.squareup.retrofit2 ...

  9. Retrofit 2.0 使用详细教程

    文章来自:https://blog.csdn.net/carson_ho/article/details/73732076 前言 在Andrroid开发中,网络请求十分常用 而在Android网络请求 ...

随机推荐

  1. rtl8723 2个 wlan

    安装8723bs.ko模块之后,生成了wlan0和wlan1,MAC地址一样. http://blog.csdn.net/djman007/article/details/46731335 解决方法: ...

  2. Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名

    Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf  动态库的后缀为*.so  静态库的后缀为 libxxx.a   ldconfig   目录名 转载自:http://b ...

  3. Android中取消GridView & ListView默认的点击背景色

    方法一: gridView.setSelector(new ColorDrawable(Color.TRANSPARENT)); listView.setSelector(new ColorDrawa ...

  4. ios - 自动布局框架编写(更多功能完善中)

    之前用的storyboard以及xib挺多的,最近看到朋友用第三方框架---自动布局约束框架在添加控件约束的时候老实报错.后来自己就试了试纯代码创建以及约束控件.但是纯代码约束一个控件还可以,如果约束 ...

  5. JQuery + JSON作为前后台数据交换格式实践

    JQuery + JSON作为前后台数据交换 JQuery提供良好的异步加载接口AJAX,可以局部更新页面数据, http://api.jquery.com/category/ajax/ JSON作为 ...

  6. chrome浏览器不允许记忆登录账户的方法

    autocomplete方法 https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_ ...

  7. .Net分布式架构(一):Nginx实现负载均衡

    一:负载均衡简介 负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器.FTP服务器.企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务. ...

  8. struts2数据校验与国际化

    数据校验: Action里的validate()方法能校验action类所有的方法,如果有错,如:addFieldError,会自动返回到workflow校验拦截器不向下继续进行,不用return i ...

  9. 0506 Scrum 项目1.0

    团队名称:√3 团队目标:全力完成这次的项目 团队口号:我要改变世界,改变自己!!! 演讲稿:我们的产品 鸡汤精选 是为了解决 当下社会出现的太多的负能量使得人们的内心十分 的痛苦, 他们需要强大的正 ...

  10. JSP-14- 常用集合类和接口

    List接口 List接口与实现类是容量可变的列表,可按索引访问集合中的元素,是有序的集合. Arraylist是以 array方式实现的List,允许快速随机存取,相当于LinkedList 不适合 ...