执行某种"背景"的正确方法是什么?操作,比如在数据库中保存数据,当演示者触发此操作时,但演示者是否在查询结束之前处置了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");
});
}
答案 0 :(得分:0)
我既不是Java也不是Android专家,但您在问题中描述的内容对我来说听起来像是控制流问题。 如果触发某些异步活动(例如保存),您还应该将清理连接到它。一种可能的解决方案可能是使用&#34; future&#34;或者&#34;承诺&#34;。另一个可能是actor模式,其中save和cleanup将是顺序执行的消息。