是时候来了解一波Retrofit2了。

之前的网络请求一直是用的okhttp,这段时间了解了一下retrofit2,发现比自己封装的okhttp灵活很多,他的所有请求方式都是用接口实现,不像okhttp那样,万一想获取一个新的callback,又得重新封装一个方法。

项目只要导入了okhttp,retrofit默认用okhttp请求网络,返回的类型是Call,那么就响应OkHttp的callback

可以配合RxJava使用,返回的类型设置为Oservable。

导包:

    compile ‘io.reactivex:rxjava:1.1.3‘
    compile ‘io.reactivex:rxandroid:1.1.0‘
    compile ‘com.squareup.retrofit2:retrofit:2.0.2‘
    compile ‘com.squareup.retrofit2:converter-gson:2.0.2‘
    compile ‘com.squareup.retrofit2:converter-scalars:2.0.2‘
    compile ‘com.squareup.retrofit2:adapter-rxjava:2.0.2‘
    compile ‘com.jakewharton:butterknife:7.0.1‘
    compile ‘com.squareup.okhttp3:okhttp:3.2.0‘
    compile ‘com.squareup.okio:okio:1.8.0‘

在这里遇到一些坑,如果下面三个少一个,返回他不支持的结果时,就会崩溃,这也是上面为什么会导那么多包的原因。

   private static Retrofit getRetrofit(String url) {
        return new Retrofit.Builder().baseUrl(url)
                //增加返回值为String的支持
                .addConverterFactory(ScalarsConverterFactory.create())
                //增加返回值为Gson的支持(以实体类返回)
                .addConverterFactory(GsonConverterFactory.create())
                //增加返回值为Oservable<T>的支持
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
    }

GET请求:

http://wthrcdn.etouch.cn/weather_mini?city=深圳

public interface IWeather {
        @GET("/weather_mini")
        Observable<Weather> getWeather(@Query("city") String city);
}
 public static final String url_weather = "http://wthrcdn.etouch.cn";
 public static IWeather getIWeather() {
        return getRetrofit(url_weather).create(IWeather.class);
    }
    HttpUtil.getIWeather().getWeather("深圳")
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(new Action1<Weather>() {
                            @Override
                            public void call(Weather weather) {
                                tv.setText(weather.getData().getGanmao());
                            }
                        });

Post请求:

根据后台,Multipart或FormUrlEncoded,如果不知道最好两种都试一下,我在这里也是遇了大坑,如果方式错了,根本就post不上去。。

Multipart(这个是用的自己的服务器,后面的人看到这篇博客可能这个api就用不了了)

http://122.114.38.95:8857

参数是 action , 如果action=banner就可以返回正确结果否则错误结果

  @Multipart
    @POST("/")
    Observable<String> getBanner(@Part("action") String action);
public static final String url_bannertest = "http://122.114.38.95:8857";
public static IBannerTest getBanner() {
        return getRetrofit(url_bannertest).create(IBannerTest.class);
    }
HttpUtil.getBanner().getBanner("banner")
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(new Action1<String>() {
                            @Override
                            public void call(String s) {
                                tv.setText(s);
                            }
                        });

FormUrlEncoded:(借用了w3c的教程里的url)

http://www.w3school.com.cn/ajax/demo_post2.asp

参数 fname,lname

  @FormUrlEncoded
    @POST("/ajax/demo_post2.asp")
    Observable<String> postW3c(@Field("fname") String fname, @Field("lname") String lname);
 public static final String w3c_url = "http://www.w3school.com.cn";
 public static IW3c getIW3C() {
        return getRetrofit(w3c_url).create(IW3c.class);
    }
 HttpUtil.getIW3C().postW3c("Long","Hoyn")
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(new Action1<String>() {
                            @Override
                            public void call(String s) {
                                tv.setText(s);
                            }
                        });

post上传图片:

在这里是用了image++的接口。

http://apicn.imageplusplus.com/analyze?

参数:api_key,api_secret, img

    @Multipart
    @POST("/analyze")
    Observable<String> upLoadImage( @Part("api_key") String api_key, @Part ("api_secret") String api_secret,@Part MultipartBody.Part file );
 public static final String imagepp_url = "http://apicn.imageplusplus.com";
 public static IImagePP getIImagePP() {
        return getRetrofit(imagepp_url).create(IImagePP.class);
    }

 public static MultipartBody.Part postFileParams(String key, File file) {
        RequestBody fileBody = RequestBody.create(MediaType.parse("image/*"), file);
        return MultipartBody.Part.createFormData(key, file.getName(), fileBody);
    }
File file = new File(Environment.getExternalStorageDirectory()+"/123.png");
                HttpUtil.getIImagePP().upLoadImage("c1a2b3ab56a2f218aed9b2ab3c16ce88","be8318b73cef1c2bcafb6c8a77922436",HttpUtil.postFileParams("img", file))
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(new Action1<String>() {
                            @Override
                            public void call(String s) {
                                tv.setText(s);
                            }
                        });

这里用到了okhttp的特性,这也是为什么要导入okhttp的原因。

private static Retrofit getRetrofit(String url) {
        return new Retrofit.Builder().baseUrl(url)
                .addConverterFactory(ScalarsConverterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
    }

上面说到了Retrofit加入了3句。

ScalarsConverterFactory是支持返回String类型

GsonConverterFactory是支持返回实体类。

RxJavaCallAdapterFactory是支持返回rxJava的Observable。

上面的例子Get请求用到了GsonConverterFactory和RxJavaCallAdapterFactory。

Post用到了ScalarsConverterFactory和RxJavaCallAdapterFactory

少一个都会蹦,所以大家用retrofit需要注意这一点。

时间: 2024-10-07 12:55:05

是时候来了解一波Retrofit2了。的相关文章

实现斐波那契神兔

1.用循环实现不死神兔 故事得从西元1202年说起,话说有一位意大利青年,名叫斐波那契. 在他的一部著作中提出了一个有趣的问题:假设一对刚出生的小兔一个月后就能长成大兔, 再过一个月就能生下一对小兔,并且此后每个月都生一对小兔,一年内没有发生死亡, 问:一对刚出生的兔子,一年内繁殖成多少对兔子? 1 1 2 3 5 8 13 21 1 import java.util.Arrays; 2 3 public class Tu { 4 5 public static void main(String

用递归和非递归的方法输出斐波那契数列的第n个元素(C语言实现)

费波那契数列(意大利语:Successione di Fibonacci),又译为费波拿契数.斐波那契数列.费氏数列.黄金分割数列. 在数学上,费波那契数列是以递归的方法来定义: {\displaystyle F_{0}=0} {\displaystyle F_{1}=1} {\displaystyle F_{n}=F_{n-1}+F_{n-2}}(n≧2) 用文字来说,就是费波那契数列由0和1开始,之后的费波那契系数就是由之前的两数相加而得出.首几个费波那契系数是: 0, 1, 1, 2, 3

Retrofit2实现App自动更新

原理 Retrofit2和okhttp实现了apk的下载 自定义类实现Retrofit2的Callback类在里面通过IO流写入文件并且使用RxBus订阅下载进度 自定义类实现okhttp3的ResponseBody类并且在里面使用RxBus发布下载进度信息 在Service中使用Retrofit在后台下载文件 发送Notifaction到通知栏前台界面展示进度情况 实现步骤 1.创建UpdateManger管理类 这个类主要写了两个管理更新和弹框的方法. /** - 检测软件更新 */ pub

斐波纳契数之组合

斐波纳契数之组合 Time Limit: 1000 MS Memory Limit: 65535 K Total Submit: 145(66 users) Total Accepted: 83(65 users) Rating: Special Judge: No Description 斐波那契数列是这么定义的:F0 = 1, F1 = 1, F2 = F1 + F0,··· Fn = Fn-1 + Fn-2(n>=2),对于每一项,它们都是斐波那契数. 现在给出一个整数d,求一个组合使得a

斐波拉切

第一种方法: public class Fibonacci2{  //定义数组方法 public static void main(String[] args) {  int arr[] = new int[20];  arr[0] = arr[1] = 1;  for (int i = 2; i < arr.length; i++) {   arr[i] = arr[i - 1] + arr[i - 2]; }  System.out.println("斐波那契数列的前20项如下所示:&

一大波Java来袭(五)——Java集合概述

把"Java集合"比作是容器,可以把多个对象(实际:是对象的引用),扔在容器中. JDK1.5之前,被丢进集合中的对象,会丢失起数据类型.默认为Object类型 JDK1.5之后,不会丢失数据类型,因为引入了"泛型"(作为下文重点) 本文将结合数据结构,重点讲述Java的4种集合体系的功能和用法,并给出不同应用场景改如何选择? 一.同样是用于"存储数据",既可以使用"数组",有可以使用"集合",有什么区别吗

NYOJ 698 A Coin Problem (斐波那契)

链接:click here 题意: 描述 One day,Jiameier is tidying up the room,and find some coins. Then she throws the coin to play.Suddenly,she thinks of a problem ,that if throw n times coin ,how many situations of no-continuous up of the coin. Hey,Let's solve the

Fibonacci斐波拉契数列----------动态规划DP

n==10 20 30 40 50 46 体验一下,感受一下,运行时间 #include <stdio.h>int fib(int n){ if (n<=1)     return 1; else            return fib(n-1)+fib(n-2); }int main( ){ int n; scanf("%d",&n); printf("%d\n" ,fib(n) );} 先 n==10 20 30 40 50 46

微软私有云分享(R2)10-SCVMM报错干货一小波

对于运维工作而言,稳定运行当然没啥说的,让人头痛的都是出现了一大波错误却无法解决. 今天为大家分享一下我在SCVMM2012(SP1和R2) 中遇到的一大波错误. =======都是干货============ 12704,无法连接到Hyper-V服务,一般来说这时候是网络有问题造成SCVMM2012 R2与Hyper-V主机主机失去联系.这时候要先排查网络,看用Hyper-V能否连接,连接不了就重启机器吧. 25322,群集悲剧,新增加的群集节点配置和其他节点不一样,这个就是看提示,慢慢让全新