【问题标题】:Manage multiple data sources管理多个数据源
【发布时间】:2020-07-09 14:43:56
【问题描述】:

我正在开发像 Instagram 和 LinkedIn 这样的社交应用程序,我对如何管理多个数据源(roomLocalDataSource、remoteDataSource)感到困惑。

我想在打开应用程序后直接从roomLocalDataSource 加载数据并在RecyclerView 中显示它(如果存在),还从remoteDataSource 获取数据,并在成功显示按钮时向用户显示新帖子,如机制发生在 Instagram 和 LinkedIn,

这是我的RemoteDataSource:

public Single<List<Movie>> getMoviesFromRemote() {
      return moviesApiService.getMovies();
}

这是我的RoomLocalDataSource:

public Single<List<Movie>> getMoviesFromLocal() {
      return moviesDao.getMovies();
}

这是我的MoviesDao:

@Query("SELECT * FROM movies)
Single<List<Movie>> getMovies();

这是我的MoviesApiService:

@GET("movies")
Single<List<Movie>> getMovies();

这是我的MoviesRepository:

public List<Movie> getMovies() {
      // Here i will get data using (roomLocalDataSource, remoteDataSource) and send to viewModel
}

我曾尝试concat 操作员处理两个数据源,但在互联网上我只从远程获取数据,而没有从本地获取。

我知道它由 RXJava 运算符处理,但我不知道哪个特定的运算符可以帮助我。

【问题讨论】:

    标签: caching retrofit2 android-room rx-java2 repository-pattern


    【解决方案1】:

    你可以做类似下面的代码

    getMoviesFromLocal()
        .doOnSuccess(localData -> //Update the UI)
        //Now fetch from Remote
        .flatMap(
            //Get movie list from remote, map to new List with Local and remote movie
            localData -> getMoviesFromRemote().map(remoteData -> Collections.addAll(localData, remoteData)
        )
        .subscribe(
            result -> //List of Movies from remote and Local,
            error -> //Handle error
        )
    

    【讨论】:

      【解决方案2】:

      在您的MoviesRepository 中,您可以先获取RoomLocalDataSource 中的数据并与RemoteDataSource 连接

      public Flowable<Movie> getMovies() {
            return roomLocalDataSource.getMoviesFromLocal()
                      .concatWith(remoteDataSource.getMoviesFromRemote());
      }
      

      然后您订阅 Flowable,您的 onNext 方法将被调用两次,第一次使用 Room 返回的列表,第二次使用从远程数据源获取的列表

      public class MoviesSubscriber extends DisposableSubscriber<List<Movie>>(){
          @Override
          public void onNext(List<Movie> movies) {
              // TODO: handle the list
          }
      
          @Override
          public void onError(Throwable t) {
              // ...
          }
      
          @Override
          public void onComplete() {
              // ...
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-31
        • 1970-01-01
        • 2016-09-25
        • 2018-09-20
        • 2015-02-15
        • 2014-05-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多