Десериализация/преобразование 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?

Возможно похожие посты


person gaara87    schedule 29.12.2016    source источник


Ответы (1)


Я не использовал Retrofit 1.x, но в v2 вы можете определить тип возвращаемого значения как объект Response (т. е. Observable<Response<SomeSerializableObject>> вместо Observable<SomeSerializableObject>). Таким образом, десериализация не должна происходить до тех пор, пока пользователь не вызовет для него метод .body(). Таким образом, вы можете изменить поток с помощью оператора observeOn, чтобы он десериализовался в указанном вами планировщике, например, с помощью оператора map.

Я не могу гарантировать, что это возможно и в Retrofit 1.x, но вы сможете легко это исследовать.

person koperko    schedule 29.12.2016
comment
К вашему сведению, у меня v2, а не v1. Интересно, можете ли вы предоставить код, который предполагает, что десериализация не должна происходить до тех пор, пока пользователь не вызовет для него метод .body() - person gaara87; 29.12.2016
comment
О, извините .. Я увидел ваше первое предложение и пришел к выводу, что вы используете v1 :) Я напишу пример и отредактирую свой ответ. - person koperko; 29.12.2016
comment
хорошо, этот ответ недействителен.. При написании примера я проверил реализацию, и это не лень, как я думал раньше.. - person koperko; 29.12.2016