当前位置: 首页 > 知识库问答 >
问题:

基于RxJava和游标的RESTful分页

华子航
2023-03-14

我正在使用Spotify API,并希望使用RXJava链接一些分页结果。Spotify使用基于光标的分页,因此@lopar中的解决方案将不起作用。

{
  "artists" : {
    "items" : [ {
      "id" : "6liAMWkVf5LH7YR9yfFy1Y",
      "name" : "Portishead",
      "type" : "artist"
    }],
    "next" : "https://api.spotify.com/v1/me/following?type=artist&after=6liAMWkVf5LH7YR9yfFy1Y&limit=50",
    "total" : 119,
    "cursors" : {
      "after" : "6liAMWkVf5LH7YR9yfFy1Y"
    },
    "limit" : 50,
    "href" : "https://api.spotify.com/v1/me/following?type=artist&limit=50"
  }
}
public class CursorPager<T> {
    public String href;
    public List<T> items;
    public int limit;
    public String next;
    public Cursor cursors;
    public int total;

    public CursorPager() {
    }
}

public class ArtistsCursorPager {
    public CursorPager<Artist> artists;

    public ArtistsCursorPager() {
    }
}
public interface SpotifyService  {

    @GET("/me/following?type=artist")
    Observable<ArtistsCursorPager> getFollowedArtists(@Query("limit") int limit);

    @GET("/me/following?type=artist")
    Observable<ArtistsCursorPager> getFollowedArtists(@Query("limit") int limit, @Query("after") String spotifyId);

}

mSpotifyService.getFollowedArtists(50)
        .flatMap(result -> Observable.from(result.artists.items))
        .flatMap(this::responseToArtist)
        .sorted()
        .toList()
        .subscribe(new Subscriber<List<Artist>>() {
            @Override
            public void onNext(List<Artist> artists) {
                callback.onSuccess(artists);
            }
            // ...
        });

我希望返回callback.success(list ) 中的所有艺术家(在本例中为119)。我是RxJava的新手,所以我不确定是否有一个聪明的方法来做到这一点。

共有1个答案

微生阳平
2023-03-14

递归解决方案的唯一问题是堆栈溢出问题。不用递归的一种方法是

Observable<ArtistsCursorPager> allPages = Observable.defer(() ->
{
    BehaviorSubject<Object> pagecontrol = BehaviorSubject.create("start");
    Observable<ArtistsCursorPager> ret = pageControl.asObservable().concatMap(aKey ->
    {
        if (aKey != null && aKey.equals("start")) {
            return Observable.getFollowedArtists(50).doOnNext(page -> pagecontrol.onNext(page.cursors.after));
        } else if (aKey != null && !aKey.equals("")) {
            return Observable.getFollowedArtists(50,aKey).doOnNext(page -> pagecontrol.onNext(page.cursors.after));
        } else {
            return Observable.<ArtistsCursorPager>empty().doOnCompleted(()->pagecontrol.onCompleted());
        }        
    });
    return ret;
});

请参阅此问题的解决方案。

 类似资料:
  • 本文向大家介绍基于游标的分页接口实现代码示例,包括了基于游标的分页接口实现代码示例的使用技巧和注意事项,需要的朋友参考一下 前言 分页接口的实现,在偏业务的服务端开发中应该很常见,PC时代的各种表格,移动时代的各种feed流、timeline。 出于对流量的控制,或者用户的体验,大批量的数据都不会直接返回给客户端,而是通过分页接口,多次请求返回数据。 而最常用的分页接口定义大概是这样的: 接口传入

  • 6.9.1 基于Cursor的ItemReaders 使用游标(cursor)是大多数批处理开发人员默认采用的方法, 因为它是处理有关系的数据“流”在数据库级别的解决方案。Java 的 ResultSet 类其本质就是用面向对象的游标处理机制。 ResultSet 维护着一个指向当前数据行的 cursor。调用 ResultSet 的 next 方法则将游标移到下一行。 Spring Batch

  • 目前,我正在尝试用Java开发基于2D平铺的侧滚游戏,主要基于David Brackeen的“用Java开发游戏”中的代码和示例 目前地图文件的大小为100x100个图块(每个图块为64x64像素)。我已经将系统配置为仅显示玩家可见的图块。Graphics系统由ScreenManager类管理,该类返回当前BufferStrategy的图形对象,如下所示: ScreenManager.java 来

  • 我在eclipse中使用“Jersey”原型开发了一个非常小的restful Web服务,并且在Tomcat中成功地部署了该服务。但是,我无法在WebLogic12c中部署它。这是我到目前为止所尝试的: 创建了一个包含泽西岛图书馆的共享库,正如我在其中一篇文章中看到的。这是我的pom.xml,它生成包含所需清单文件的共享库: 块引号 在我的webservice应用程序中的WEB-INF文件夹下添加

  • 所以我有(gridLayout),每个JXButton都有一个图标,一个播放器所属的片段,并且有一个。 我目前正在努力使战略游戏(两个球员-我处理两者)。我设置了图标,碎片和一个碎片应该如何移动。 现在我希望让它轮流播放。 我的思想播放器2件当播放器1转动时隐藏。 和应该改变图标时,播放器2。 如果这两种方法看起来还可以,那么我的问题在于如何实现转向。

  • 使用Cocos2D, 模仿QQ连连看写的一个连连看游戏Demo,有声音效果。 [Code4App.com]