使用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中的可能性,但是您应该能够轻松地进行研究。
仅供参考,我在v2上,没有v1。 这很有趣,你能否提供代码,暗示“反序列化不应该发生,直到用户调用.body()方法” – gaara87
哦,我很抱歉..我看到你的第一句话,并得出结论:你正在使用v1 :)我会写一些例子,并编辑我的答案 – koperko
好的,这个答案是无效的。当写这个例子,我检查了实现,它不是懒惰的,因为我以前认为.. – koperko