LiveDataReactiveStreams: как обрабатывать ошибки при использовании fromPublisher()

Я пытаюсь преобразовать Flowable в LiveData с помощью Reactive Streams. Просмотрел кучу статей, но до сих пор не понял концепции обработки состояний ошибок. В настоящее время я нахожусь на начальном этапе изучения RxJava. Было бы очень полезно, если бы кто-нибудь мог предоставить мне подробное объяснение того, как я должен справиться с этой проблемой.

Repository.java

    public class Repository {

    private static final String API_KEY = "";
    private static final String TAG = "Repository class- ";

    private MovieService _movieApi;
    private MediatorLiveData<MovieJsonData> _movieList;
    private static Repository _repositoryInstance;

    public static Repository getInstance(){
        if(_repositoryInstance == null){
            return new Repository();
        }
        return _repositoryInstance;
    }

    private Repository(){
        _movieApi = MovieClient.getTrendingMovieClient().create(MovieService.class);
        _movieList = new MediatorLiveData<>();
    }

    public MediatorLiveData<MovieJsonData> fetchData(){

        LiveData<MovieJsonData> _source = LiveDataReactiveStreams.fromPublisher(
                _movieApi.getTrendingMovies(API_KEY)
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .doOnError(error -> Log.d(TAG, "fetchData: " + error.getMessage()))
        );

        _movieList.addSource(_source, new Observer<MovieJsonData>() {
            @Override
            public void onChanged(MovieJsonData movieJsonData) {
                _movieList.setValue(movieJsonData);
            }
        });

        return _movieList;
    }}

Трассировка стека ошибок:

    D/Repository class-: fetchData: timeout 
    W/System.err:io.reactivex.exceptions.UndeliverableException: The exception could not be delivered to 
    the consumer because it has already canceled/disposed the flow or the exception has nowhere to go to 
    begin with.
    Caused by: java.lang.RuntimeException: LiveData does not handle errors. Errors from publishers should 
    be handled upstream and propagated as state

person Mridul    schedule 07.07.2020    source источник


Ответы (1)


Все просто: LiveData не обрабатывает ошибки. Вы справитесь с ними.

Живые данные намного проще, чем реактивные наблюдаемые. Оперативные данные отвечают за доставку 100% неповрежденных объектов. Вот и все.

Если вы посмотрите документацию LiveDataReactiveStreams.fromPublisher (здесь) вы увидите, что прямо сказано, что оперативные данные не обрабатывают ошибки:

Обратите внимание, что LiveData НЕ обрабатывает ошибки и ожидает, что ошибки обрабатываются как состояния хранимых данных. В случае ошибки, выдаваемой издателем, ошибка будет распространена на основной поток, и приложение выйдет из строя.

Чтобы избежать сбоя, используйте onErrorReturn:

 LiveData<MovieJsonData> _source = LiveDataReactiveStreams.fromPublisher(
            _movieApi.getTrendingMovies(API_KEY)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .onErrorReturn(error -> EmptyMovieJsonData())
    );
person Jenea Vranceanu    schedule 07.07.2020