Десериализация / преобразование Retrofit2 в неосновном потоке с использованием rxjava
Я уже ссылался на этот ответ, и, похоже, он связан с Retrofit v1.
Цель -> Сократить время холодного запуска, заставив ObjectMapper работать с неосновным потоком. Это изображение показывает трассировку стека, происходящую в основном потоке.
Настроить:
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 ответ
Я не использовал Retrofit 1.x, но в v2 вы можете определить тип возвращаемого значения как Response
объект (т.е. Observable<Response<SomeSerializableObject>>
вместо Observable<SomeSerializableObject>
) .. таким образом, десериализация не должна происходить, пока пользователь не вызовет .body()
метод на это. Таким образом, вы можете изменить поток через observeOn
оператор, так что он десериализуется на указанном вами планировщике в течение map
оператор например.
Я не могу гарантировать, что это возможно и в Retrofit 1.x, но вы должны легко это исследовать.