2016-12-29 5 views
1

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>>として戻り値の型を定義することができます

答えて

0

Observable<SomeSerializableObject>)..このように、ユーザーが.body()メソッドを呼び出すまで、デシリアライズは発生しません。このようにして、observeOn演算子を介してストリームを変更して、指定されたスケジューラでmap演算子内で逆シリアル化することができます。

Retrofit 1.xでも可能であるとは限りませんが、簡単に調べることができます。

+0

参考までに、私はv2、v1は使用していません。 興味深いことに、「ユーザーが.body()メソッドを呼び出すまで、逆シリアル化を実行しないでください」というコードを提供できますか? – gaara87

+0

ああ、ごめんなさい..あなたの最初の文を見て、結論に至りましたあなたはv1を使用しています:)私はいくつかの例を書いて、私の答えを編集します – koperko

+0

大丈夫です、この答えは無効です..例を書いたとき、私は実装をチェックし、私は以前考えていたように怠惰ではありません.. – koperko

関連する問題