this answer alreadyを参照しましたが、これはRetrofit v1に関連しているようです。rxjavaを使用して非メインスレッドでの逆シリアル化/変換
ゴール - > 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()))
するための構成であるがobjectmappingが動作しているようJacksonConverterFactory内ネットワーク呼び出し
compatibilityService().isCompatible()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(response -> { ...});
を作るの代表例でありますメインスレッドで
RxJavaから離れることなく解決策はありますか?
おそらく関連記事私はレトロフィット1.1を使用しませんでしたが、V2にあなたの代わりにResponse
オブジェクト(すなわちObservable<Response<SomeSerializableObject>>
として戻り値の型を定義することができます
- Retrofit2.0 using with rxjava will do costly reflection in mian thread even using subscribeOn()
- https://github.com/ReactiveX/RxJava/issues/4347
参考までに、私はv2、v1は使用していません。 興味深いことに、「ユーザーが.body()メソッドを呼び出すまで、逆シリアル化を実行しないでください」というコードを提供できますか? – gaara87
ああ、ごめんなさい..あなたの最初の文を見て、結論に至りましたあなたはv1を使用しています:)私はいくつかの例を書いて、私の答えを編集します – koperko
大丈夫です、この答えは無効です..例を書いたとき、私は実装をチェックし、私は以前考えていたように怠惰ではありません.. – koperko