我正在开发像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操作符处理的,但在我的情况下,我不知道哪个特定的操作符可以帮助我。
发布于 2020-07-12 04:09:11
您可以执行类似于以下代码的操作
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
)发布于 2020-07-23 21:05:13
在您的MoviesRepository中,您可以首先获取RoomLocalDataSource中的数据并与RemoteDataSource连接
public Flowable<Movie> getMovies() {
return roomLocalDataSource.getMoviesFromLocal()
.concatWith(remoteDataSource.getMoviesFromRemote());
}然后订阅可流动的,您的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() {
// ...
}
}https://stackoverflow.com/questions/62817478
复制相似问题