使用rxjava在非主线程上进行Retrofit2反序列化/转换

时间:2016-12-29 18:55:48

标签: multithreading jackson rx-java retrofit2 cold-start

我提到了this answer already,它似乎与Retrofit v1有关。

目标 - > 通过使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内,对象映射似乎在主线程上有效。

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

可能相关的帖子

1 个答案:

答案 0 :(得分:0)

我没有使用Retrofit 1.x,但是在v2中你可以将返回类型定义为Response对象(即Observable<Response<SomeSerializableObject>>而不是Observable<SomeSerializableObject>)..这样,反序列化不应该发生,直到用户在其上调用.body()方法。这样,您可以通过observeOn运算符修改流,以便在map运算符中对指定的调度程序进行反序列化。

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