LiveDataReactiveStreams:使用 fromPublisher() 时如何处理错误

LiveDataReactiveStreams: How to handle errors while using fromPublisher()

我正在尝试使用 Reactive Streams 将 "Flowable" 转换为 "LiveData"。查阅了一堆文章,但我仍然没有掌握处理错误状态的概念。目前,我正处于学习 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

很简单:LiveData 不处理错误。你处理它们。

实时数据比反应式可观察量简单得多。实时数据负责交付 100% 完整的对象。就是这样。

如果您查看 LiveDataReactiveStreams.fromPublisher (here) 的文档,您会看到明确表示实时数据不处理错误:

Note that LiveData does NOT handle errors and it expects that errors are treated as states in the data that's held. In case of an error being emitted by the publisher, an error will be propagated to the main thread and the app will crash.

为避免崩溃,请使用 onErrorReturn:

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