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, така че да се десериализира на посочения от вас Scheduler в рамките на оператора map например.

Не мога да гарантирам, че е възможно и в Retrofit 1.x, но трябва да можете да проучвате толкова лесно.

person koperko    schedule 29.12.2016
comment
FYI, аз съм на v2, не на v1. Това е интересно, можете ли да предоставите кода, който предполага, че десериализацията не трябва да се случва, докато потребителят не извика метода .body() върху него - person gaara87; 29.12.2016
comment
О, съжалявам.. Видях първото ви изречение и стигнах до заключението, че използвате v1 :) Ще напиша пример и ще редактирам отговора си - person koperko; 29.12.2016
comment
добре, този отговор е невалиден .. Когато пишех примера, проверих изпълнението и не е мързеливо, както си мислех преди.. - person koperko; 29.12.2016