Как вручную отменить / утилизировать RXJava2 Flowable? - PullRequest
1 голос
/ 01 июня 2019

У меня есть проект Android, использующий зависимость FileStack , основанную на RX Java 2. В частности, io.reactivex.rxjava2:rxjava:2.1.2.До сих пор это не было проблемой, так как я не мог понять, как конкретно отменить Flowable .

Я реализовал

Вот мой код ниже:

private Flowable<Progress<FileLink>> upload;

private void myMethod(){
    upload = new Client(myConfigOptionsHere)
      .uploadAsync(filePath, false, storageOptions);

        upload.doOnNext(progress -> {
                    double progressPercent = progress.getPercent();
                    if(progressPercent > 0){
                        //Updating progress here
                    }
                    if (progress.getData() != null) {
                        //Sending successful upload callback here
                    }
                })
                .doOnComplete(new Action() {
                    @Override
                    public void run() throws Exception {
                        //Logging he complete action here
                    }
                })
                .doOnCancel(new Action() {
                    @Override
                    public void run() throws Exception {
                        //Logging the cancel here
                    }
                })
                .doOnError(new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable t) throws Exception {
                        //Logging the error here
                    }
                })
                .subscribe();

}

public void cancelUpload(){
    //What do I do here to manually stop the upload Flowable? 
    //IE upload.cancel();
}

Что мне нужно сделать / вызвать против upload Flowable так, чтобыЯ могу вручную отменить отмену, когда пользователь отменяет загрузку нажатием кнопки? Я вижу людей , рекомендующих , звонящих dispose, но я не вижу эту опцию при проверке доступных методов для использованияпротив текучих.

1 Ответ

2 голосов
/ 01 июня 2019

Оказывается, проблема в том, что я пытался избавиться от / отменить неправильный объект. Я изменил свой код следующим образом:

private Disposable disposable;

private void myMethod(){
    Flowable<Progress<FileLink>> upload = new Client(myConfigOptionsHere)
      .uploadAsync(filePath, false, storageOptions);

        this.disposable = upload.doOnNext(progress -> {
                    double progressPercent = progress.getPercent();
                    if(progressPercent > 0){
                        //Updating progress here
                    }
                    if (progress.getData() != null) {
                        //Sending successful upload callback here
                    }
                })
                .doOnComplete(new Action() {
                    @Override
                    public void run() throws Exception {
                        //Logging he complete action here
                    }
                })
                .doOnCancel(new Action() {
                    @Override
                    public void run() throws Exception {
                        //Logging the cancel here
                    }
                })
                .doOnError(new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable t) throws Exception {
                        //Logging the error here
                    }
                })
                .subscribe();

}

public void cancelUpload(){
    if(this.disposable != null){
        this.disposable.dispose();
        this.disposable = null;
    }
}

и смог заставить его работать нормально. По сути, вам нужно вызывать метод dispose() для объекта dispose, а не для Flowable.

Спасибо за помощь / сообщение jschuss

...