处理UseCase时,继续在存储库层中执行observable

时间:2018-01-22 16:58:33

标签: android rx-java2 clean-architecture

执行某种"背景"的正确方法是什么?操作,比如在数据库中保存数据,当演示者触发此操作时,但演示者是否在查询结束之前处置了observable?

我应该将我的Repository observable与UseCase解析吗?

实施例

我使用RxJava和Dagger开发了遵循Clean Architecture和MVP模式的Android应用程序。

在对话框中,我列出了设备,并且可以在列表中选择设备时连接到设备。 单击列表中的元素时,对话框将被取消,并且我将此设备设置/保存为当前'我的存储库层中的设备和活动工具栏中的徽标动画(不知何故,就像Chromecast正在做的那样)。

在我的演示者中,我在分离视图时处理我的UseCases,因此如果在关闭对话框时保存未完成,则observable将被处理掉并且设备未被设置为“当前'设备

演示

@Override
public void deviceClicked(String id) {
    getMvpView().dismissView();
    mConnectToDeviceUseCase.execute(id, new DisposableCompletableObserver() {
        @Override
        public void onComplete() {
            Timber.d("Connected to device");
        }

        @Override
        public void onError(Throwable e) {
            Timber.e("Error while connecting to device: %s", e.getMessage());
        }
    });
}

用例

public class ConnectToDeviceUseCase extends UseCaseCompletableWithParameter<String, DevicesRepository> {

    @Inject
    public ConnectToDeviceUseCase(DevicesRepository DevicesRepository,
                                   @Named("Thread") Scheduler threadScheduler,
                                   @Named("PostExecution") Scheduler postExecutionScheduler) {
        super(devicesRepository, threadScheduler, postExecutionScheduler);
    }

    @Override
    protected Completable buildObservable(String id) {
        Timber.d("GetDevicesUseCase buildObservable");

        return repository.connectToDevice(id);
    }
}

存储库

private ReplaySubject<DeviceConnection> connectionStatus = ReplaySubject.create();

...

@Override
public Completable connectToDevice(String id) {
    Timber.d("connectToDevice IN");
    return mDLNADataSource.getDevices()
            .flatMapIterable(items -> items)
            .filter(item -> item.id().equals(id))
            .firstOrError()
            .flatMapCompletable(this::saveAsCurrent)
            .doOnSubscribe(a ->
                    {
                        Timber.d("connectToDevice doOnSubscribe");
                        connectionStatus.onNext(DeviceConnection.builder().setStatus(DeviceConnection.STATUS_CONNECTING).build());
                    }
            )
            .doOnComplete(() ->
                    {
                        Timber.d("connectToDevice doOnComplete");
                        connectionStatus.onNext(DeviceConnection.builder().setStatus(DeviceConnection.STATUS_CONNECTED).build());
                    }
            )
            .doOnError(a ->
                    {
                        Timber.d("connectToDevice doOnError");
                        connectionStatus.onNext(DeviceConnection.builder().setStatus(DeviceConnection.STATUS_NOT_CONNECTED).build());
                    }
            )
            .doOnDispose(() ->
            {
                Timber.d("connectToDevice doOnDispose");
            });

}

1 个答案:

答案 0 :(得分:0)

我既不是Java也不是Android专家,但您在问题中描述的内容对我来说听起来像是控制流问题。 如果触发某些异步活动(例如保存),您还应该将清理连接到它。一种可能的解决方案可能是使用&#34; future&#34;或者&#34;承诺&#34;。另一个可能是actor模式,其中save和cleanup将是顺序执行的消息。