私は他の人たちによって開発された古いプロジェクトに取り組んでおり、RxAndroidがプロジェクトで使用されています。
私はアプリケーションの要求のいくつかにキャッシュ処理を追加しなければならず、必要なときにOkHttpキャッシュはうまく機能しませんでした。だから私は、インターネット接続をチェックしてから要求を出したり、接続に応じてキャッシュから読み込んだりするためのソリューションを思いついた。私はRxAndroidと経験を持っていないが、私は少しを読んで、私はこの思い付いた:RxAndroid observable looping
@Override
public Observable<List<SocialNews>> getStream(@Path("stream") String stream, @Query("networks") String networks, @Query("page") Integer page, @Query("limit") Integer limit) {
return Observable.create(new AsyncOnSubscribe<Object, List<SocialNews>>() {
@Override
protected Object generateState() {
return null;
}
@Override
protected Object next(Object state, long requested, Observer<Observable<? extends List<SocialNews>>> observer) {
if (NetworkUtils.hasActiveInternetConnection(context)) {
observer.onNext(APIClient.getService(context).getStream(stream, networks, page, limit));
} else {
observer.onNext(Observable.just(NetworkUtils.getCachedStream()));
}
return state;
}
});
}
そして、私はこのようにそれに加入する:
final Observable<List<SocialNews>> observable = APIClient.getCacheService(getActivity()).getStream(stream, networks, page, SportFiveAPI.DEFAULT_ITEM_LIMIT);
LifecycleObservable.bindFragmentLifecycle(lifecycle(),
AppObservable.bindFragment(this, observable)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()))
.subscribeOn(Schedulers.io())
.subscribe(
socialNews -> {
// do stuff
},
error -> {
// do stuff
}
);
しかし、どういうわけか、それがループ内で立ち往生私のAsyncOnSubscribe内の次のメソッドを呼び出し続けます。誰でも私がここで間違っていることを知っていますか?
はい、あなたは 'AsyncObservable'を使用しています。代わりに 'defer'を試してください。 – akarnokd
@akarnokd 'just'の代わりに' defer'を使うと、 'Func0'で新しい' Observable'を返さなければならないので 'Observable.just(NetworkUtils.getCachedStream())'を返すでしょうか? –
また、JohnWowUsの回答も正しいでしょうか? –