RxJava for Repository:收到后保存数据

时间:2018-04-13 05:16:31

标签: java android multithreading repository-pattern rx-java2

我是RxJava的新手,我试图将它与Repository模式一起使用(通过Clean Architecture)。这是我的存储库界面:

public interface IRepository<T extends IEntity> {

    Completable add(T entity);

    Completable add(List<T> entities);

    Completable remove(T entity);

    Completable remove(List<T> entities);

    Single<T> get() throws IOException;

    Single<List<T>> getMany() throws IOException;

}

IEntity是简单的界面,可以统一我的模型类,它的实现并不重要。

这是我的存储库的实现:

public class WarehouseRepository extends Repository<Warehouse> {

    public WarehouseRepository(ILocalDataSource<Warehouse> localDataSource, 
                            IRemoteDataSource<Warehouse> remoteDataSource) {

      //Some unnecessary code
    }

    //Some unnecessary code


    @Override
    public Single<List<Warehouse>> getMany() throws IOException {

        Single<List<Warehouse>> local = mLocalDataSource.getMany(mLocalSpecification);
        Single<List<Warehouse>> remote = mRemoteDataSource.getMany(mRemoteSpecification).doOnSuccess(this::add);
        return Single.concat(local,remote).filter(warehouses -> !warehouses.isEmpty()).firstElement().toSingle();
    }


    @Override
    public Completable add(List<Warehouse> warehouses) {
        return mLocalDataSource.add(warehouses);
    }

}

我想要做的是在一个数据流中统一两个数据源,即当我在本地数据源中没有数据时,我想要请求API,当我通过remoteDataSource从API成功获取数据时,我希望自动将数据保存到db。出于这些目的,我使用.concat .filter.firstElement(),因此第一个问题将是: 这是实现目标的好方法吗?

我发现的另一个问题是Completable add(List<Warehouse> warehouses)方法永远不会调用因为我需要订阅这个可填充的才能使它工作。所以我改变了

mRemoteDataSource.getMany(mRemoteSpecification).doOnSuccess(this::add);

mRemoteDataSource.getMany(mRemoteSpecification).doOnSuccess(warehouses -> {add(warehouses).subscribe();});

但是缺乏这样的解决方案是不可能处理doOnSucess()中可能发生的异常,所以第二个问题是:

如何处理doOnSucess中发生的异常/或者有其他选择吗?

0 个答案:

没有答案