11

私はレトロフィットを使用していますが、rxjava (retrolambda を使用) が次のフローに適していると感じています。

  1. ウィジェットのリストを取得 (http)
  2. ウィジェットごとに

    a) 指定されたウィジェット タイプの記事 (http) のリストを取得する
    b) それらすべてを db に保存する
    c) リストの最初の (最新の) 記事を取得し、この記事の適切な値で widget.articleName と widget.articleUrl を更新します

  3. リストに戻して完成

ただし、ステップ 2a の後に何をすべきかわかりません。これまでの私のコードは次のとおりです

apiService.getWidgets(token)
  .flatMapIterable(widgets -> widgets)
  .flatMap(widget -> apiService.getArticles(token, widget.type))
  ...
  .toList()
  .subscribe(
     modifiedWidgets -> saveWidgets(modifiedWidgets),
     throwable -> processWidgetError(throwable)
  );

いくつかのオペレーターをいじってみましたが、連鎖するときは常に絞り込みすぎて (たとえば、1 つの記事のハンドルを取得するなど)、元のウィジェットにアクセスして変更を加えることができなくなります。

@GET("/widgets")
Observable<List<Widget>> getWidgets(@Header("Authorization") String token);

@GET("/articles")
Observable<List<Article>> getArticles(@Header("Authorization") String token, @Query("type") String type);
4

3 に答える 3

22

ストリームの特定のポイントに doOnNext を挿入して、副作用を追加できます。

apiService.getWidgets(token)
.flatMapIterable(v -> v)
.flatMap(w -> 
    apiService.getArticles(token, w.type)
    .flatMapIterable(a -> a)
    .doOnNext(a -> db.insert(a))
    .doOnNext(a -> {
         w.articleName = a.name;
         w.articleUrl = a.url;
    })
    .takeLast(1)
    .map(a -> w)
)
.toList()
.subscribe(
    modifiedWidgets -> saveWidgets(modifiedWidgets),
    throwable -> processWidgetError(throwable)
);

これが実行可能な例です。

于 2015-05-14T11:53:12.983 に答える
1

オブジェクトで変数として返されるリストを反復する例が見つからなかったため、ここに追加します。

getUserAccount(token)
    .subscribeOn(Schedulers.newThread())
    .observeOn(AndroidSchedulers.mainThread())
    .flatMap(userResponse -> Observable.just(userResponse.list))      //get list from response
    .flatMapIterable(baseDatas -> baseDatas)                          //make the list iterable
    .flatMap(baseData ->                                              //on each project, get the details
            getProjectDetails(baseData.name,token)
                    .subscribeOn(Schedulers.io())                     //get network call off the main thread
                    .observeOn(AndroidSchedulers.mainThread()))
    .subscribe(
            (dataResponse) -> {
                Timber.d( "Got Data Details:" + dataResponse);
            },
            (error) -> {
                Timber.e( "Got Error:" + error.getMessage());
            },
            () -> {
                Timber.d("Completed Data Details");
            }
    );
于 2016-05-04T20:29:34.837 に答える