Retrofit1切换到Retrofit2的注意事项

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xie666/article/details/50492912

Retrofit2在我写文字的时候已经到beta3了(2016-01-10),我担心更新会有很多坑,根据github上的ChangeLog,不敢直接引入到真实项目中去,目前使用的是Retrofit2-beta2;通过查阅changelog以及自己在demo项目中的实践,记录下本文,如有朋友看到错误,敬请留言!(莫怪)

去这里看,更详细

首先是添加依赖要注意保持版本依赖一致

接着是添加Gradle依赖项

Retrofit 2默认情况下不集成Gson和Okhttp,在1X之前,我们完全不用考虑转换器的集成问题和请求采用什么,现在的变化需要你导入你需要的转换器开源库和OkHttp,

在引入的时候加入Retrofit的依赖(Okhttp 2.5以上)

compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'
compile 'com.square.okhttp:okhttp:2.5.0'

转换器

comile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'

如果项目有用到RXJava 2X也是不引入的,这里我测试过引入

compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta2'
compile 'io.reativex:rxandroid:1.0.1'

还有几个调用的变化
1.0X以前

DrakeetRetrofit() {
        OkHttpClient client = new OkHttpClient();
        client.setReadTimeout(12, TimeUnit.SECONDS);

        RestAdapter.Builder builder =new  RestAdapter.Builder();
        builder.setClient(new OkClient(client))
               .setEndpoint("http://gank.avosapps.com/api")
               .setConverter(new GsonConverter(gson));

        RestAdapter gankRestAdapter = builder.build();
        builder.setEndpoint("https://leancloud.cn:443/1.1/classes");

        RestAdapter drakeetRestAdapter = builder.build();
        drakeetRestAdapter.setLogLevel(RestAdapter.LogLevel.FULL);

        gankService = gankRestAdapter.create(GankApi.class);
        drakeetService = drakeetRestAdapter.create(DrakeetApi.class);
    }

2.0X的变化

 Retrofit.Builder builder = new Retrofit.Builder();
 builder.baseUrl("http://gank.avosapps.com")
             .addConverterFactory(GsonConverterFactory.create(gson))
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create());

        Retrofit gankRestAdapter = builder.build();
        builder.baseUrl("https://leancloud.cn:443/1.1/classes");


        meiziService = gankRestAdapter.create(MeiziApi.class);

主要的变化是RestAdapter改为Retrofit,setEndPoint方法变成了baseUrl,同时注意在1.X以前是.setEndpoint(“http://gank.avosapps.com/api“),2.X以后就不能把api放到这里,不然是404!应该是builder.baseUrl(“http://gank.avosapps.com“)

注意没有没有默认的转换器

在之前的1的版本中默认有Gson做为json的转换器,在2的版本中没有默认的转换器,你需要自己定义转换器,如果你想使用Gson,就必须要在gradle添加Gson的依赖项:

compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'  

可用的转换器

GSON: com.squareup.retrofit:converter-gson:2.0.0-beta2
Moshi: com.squareup.retrofit:converter-moshi:2.0.0-beta2
Jackson: com.squareup.retrofit:converter-jackson:2.0.0-beta2
SimpleXML: com.squareup.retrofit:converter-simplexml:2.0.0-beta2
ProtoBuf: com.squareup.retrofit:converter-protobuf:2.0.0-beta2
Wire: com.squareup.retrofit:converter-wire:2.0.0-beta2

给Retrofit添加转换器

Retrofit retrofit = Retrofit.Builder()  
    .baseUrl("http://gank.avosapps.com");
   .addConverterFactory(ProtoConverterFactory.create())
    .addConverterFactory(GsonConverterFactory.create())
    .build();

Rxjava 集成

Retrofit 1中集成了三中请求执行机制:同步,异步和Rxjava;在Retrofit 2中默认的只有同步和异步的请求,但是Retrofit提供了一个添加其他请求执行机制进Retrofit中的方法,你可以添加更多的机制在你的app中,比如说Rxjava

Gradle 依赖

compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta2'  
compile 'io.reactivex:rxandroid:1.0.1'  

接下来需要在创建service实例之前添加一个CallAdapter进Retrofit对象

Retrofit retrofit = new Retrofit.Builder()  
    .baseUrl(baseUrl);
    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
    .addConverterFactory(GsonConverterFactory.create())
    .build();

具体代码:

public interface UserService {  
   public static final int meizhiSize = 10;
    @GET("/api/data/福利/" + meizhiSize + "/{page}")
    Observable<MeizhiData> getMeiziData(@Path("page")  int page);
}

   sGankIO.getMeiziData(1)
                .subscribeOn(Schedulers.io())
                .subscribe(new Subscriber<MeizhiData>() {
                    @Override
                    public void onCompleted() {
                        Log.e("nima", "laile ");
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e("error", "laile " + e);
                    }

                    @Override
                    public void onNext(MeizhiData meizhiData) {
                        Log.e("error", "laile " + meizhiData.results.size());
                    }
                });

END

在我的简单demo中使用的东西比较少,其他的注意我后来发现在这个地方有说明,而且很好
地址

展开阅读全文

没有更多推荐了,返回首页