使用rxjava对非主线程进行retrofit2反序列化/转换

问题描述:

我已经提到了this answer already,它似乎与Retrofit v1有关。使用rxjava对非主线程进行retrofit2反序列化/转换

目标 - > 通过使ObjectMapper在非主线程上工作来减少冷启动时间。 This image显示它在主线程上发生的堆栈跟踪。

设置:

compile "com.squareup.retrofit2:retrofit:2.1.0" 
compile "com.squareup.retrofit2:converter-jackson:2.1.0" 
compile "com.squareup.retrofit2:adapter-rxjava:2.1.0" 
compile 'io.reactivex:rxjava:1.1.9' 

这是改装

.addCallAdapterFactory(RxJavaCallAdapterFactory.createWithScheduler(Schedulers.io())) 
.addConverterFactory(JacksonConverterFactory.create(ObjectMapperFactory.getObjectMapper())) 

下面的配置进行网络通话

compatibilityService().isCompatible() 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(response -> { ...}); 

JacksonConverterFactory的objectmapping似乎工作的一个典型例子在主线程上。

没有离开RxJava的解决方案是什么?

可能相关的帖子

我没有用改造1.x中,但在v2中,你可以定义返回类型为Response对象(即Observable<Response<SomeSerializableObject>>代替Observable<SomeSerializableObject>)..这样,在用户调用.body()方法之前,反序列化不应该发生。这样,您可以通过observeOn运算符修改流,以便它在例如map运算符内的指定调度程序上反序列化。

我不能保证它在Retrofit 1.x中的可能性,但是您应该能够轻松地进行研究。

+0

仅供参考,我在v2上,没有v1。 这很有趣,你能否提供代码,暗示“反序列化不应该发生,直到用户调用.body()方法” – gaara87

+0

哦,我很抱歉..我看到你的第一句话,并得出结论:你正在使用v1 :)我会写一些例子,并编辑我的答案 – koperko

+0

好的,这个答案是无效的。当写这个例子,我检查了实现,它不是懒惰的,因为我以前认为.. – koperko