ОК, если я правильно понял ваш случай, вы хотите отменить ответ от первой загрузки и принять во внимание ответ от второй или обобщить: игнорируйте любые предыдущие ответы и принимайте во внимание только самые последние.
Если это так, то одним простым решением будет проверять compositeDisposable
каждый раз перед началом новой загрузки.Если список не пустой, то отбросьте все и добавьте в него новый одноразовый.
Примерно так:
fun uploadPhoto(){
if(compositeDisposable.size() > 0){
compositeDisposable.clear()
}
// ...
}
Обратите внимание на использование compositeDisposable.clear()
, а не .dispose()
.
Относительно вашего последующего вопроса:
Итак, вызов compositeDisposable.clear()
удалит каждый элемент в списке, более конкретно это означает, что рабочий поток будетпрервано и, да, в вашем случае это означает, что процесс загрузки будет прерван.
Если вы хотите, чтобы загрузка продолжалась, вам придется придумать другой механизм, отличный от очистки одноразовых.
Я не уверен, что вы могли бы сделать это в Rx, но одной идеей, не связанной с Rx, было бы иметь какой-то uploadId
, например, сгенерированный случайный хэш, связанный с каждой загрузкой.Этот идентификатор должен быть передан вашему сетевому уровню и затем возвращен в ответе.
Затем в ViewModel
вы будете отслеживать currentUploadId
и:
- всякий раз, когда пользователь выполняет новую загрузку, обновляйте
currentUploadId
с новым сгенерированным идентификатором - при получении
handleResponse(...)
, вы проверяете response.uploadId
с currentUploadId
, если они не совпадают, вы просто отбрасываете этоответ.