Как мне обработать исключения в map () в Observable в RxJava

Я создал очень простую библиотеку https://github.com/ravinderpayal/FooterJS

. Она очень проста в использовании. После включения библиотеки просто позвоните в эту строку кода.

footer.init(document.getElementById("ID_OF_ELEMENT_CONTAINING_FOOTER"));

Нижние колонтитулы могут быть динамически изменены путем вызова функции выше с другим параметром / id.

footer.init(document.getElementById("ID_OF_ANOTHER_ELEMENT_CONTAINING_FOOTER"));

Примечание. - Вы не должны изменять или добавлять CSS. Библиотека динамична, что подразумевает, что даже если размер экрана будет изменен после загрузки страницы, он сбросит положение нижнего колонтитула. Я создал эту библиотеку, потому что CSS решает проблему некоторое время, но когда размер отображения значительно меняется, от рабочего стола до планшета или наоборот, они либо перекрывают содержимое, либо больше не остаются липкими.

Другое решение - это CSS Media Queries, но вы должны вручную писать разные стили CSS для разных размеров экранов, в то время как эта библиотека выполняет свою работу автоматически и поддерживается всеми базовыми браузерами, поддерживающими JavaScript.

Редактирование решения CSS:

@media only screen and (min-height: 768px) {/* or height/length of body content including footer*/
    /* For mobile phones: */
    #footer {
        width: 100%;
        position:fixed;
        bottom:0;
    }
}

Теперь, если высота отображения больше, чем длина вашего содержимого, мы создадим нижний колонтитул снизу, а если нет, он будет автоматически отображаться в самом конце дисплея, поскольку вам нужно прокрутить, чтобы просмотреть это .

И это кажется лучшим решением, чем JavaScript / library one.

17
задан greatwolf 30 April 2017 в 06:27
поделиться

4 ответа

rx всегда будет ловить ошибку, даже если это RuntimeException. Таким образом, вы можете выбросить какое-то исключение Runtime в блоке catch. Вот как на самом деле это должно работать.

 Observable.just(bitmap)
                .map(b -> {
                    try {
                        // do some work which throws IOException
                        throw new IOException("something went wrong");
                    } catch (IOException e) {
                        throw new RXIOException(e);
                        // Or you can use 
                        throw Exceptions.propagate(e);
                        // This helper method will wrap your exception with runtime one
                    }
                }).subscribe(o -> {
                    // do something here
                }, exception -> exception.printStackTrace());

public static class RXIOException extends RuntimeException {
        public RXIOException(IOException throwable) {
            super(throwable);
        }
}
19
ответ дан Dave Moten 30 April 2017 в 06:27
поделиться

В версии 1.0.15 существует фабричный метод fromCallable, который позволяет запускать экземпляр Callable для каждого подписчика, в который можно также добавить проверенные исключения:

Observable.fromCallable(() -> {      
    File photoFile = new File(App.getAppContext().getCacheDir(),
        "userprofilepic_temp.jpg");
    if (photoFile.isFile()) {
       //delete the file if it exists otherwise the new file won't be created
        photoFile.delete();
    }
    photoFile.createNewFile(); //saves the file in the cache dir

    FileOutputStream fos = new FileOutputStream(photoFile);
    photoBitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos);//jpeg format
    fos.close();

    return photoFile;
})
.subscribe(...)

Редактировать:

source.flatMap(v -> {
    try {
        //...
        return Observable.just(result);
    } catch (Exception e) {
        return Observable.error(e);
    }
})
.subscribe(...);
7
ответ дан falvojr 30 April 2017 в 06:27
поделиться

Только что созданный вспомогательный класс для извлечения этого шаблона в другое место:

public class RxRethrow {
    public static <T, R> Func1<T, R> rethrow(Func1R<T, R> catchedFunc) {
        return t -> {
            try {
                return catchedFunc.call(t);
            } catch (Exception e) {
                throw Exceptions.propagate(e);
            }
        };
    }

    public interface Func1R<T, R> extends Function {
        R call(T t) throws Exception;
    }
}

Вы можете назвать его так:

.map(RxRethrow.rethrow(products -> mapper.writer(schema).writeValueAsString(products)))
3
ответ дан MercurieVV 30 April 2017 в 06:27
поделиться

Я не знаю, как была ситуация, когда этот вопрос был впервые задан и получен ответ, но RxJava в настоящее время содержит вспомогательный метод для этой конкретной цели: Exceptions.propagate(Throwable t)

RxJava Javadoc

Удобный метод для прямого выброса RuntimeException и Error или включения любого другого типа исключения в RuntimeException.

2
ответ дан Thorbear 30 April 2017 в 06:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: