我对 RxJava2 和流(Observable 和 Observer)有一些问题实际上,我的流返回一个错误
The mapper function returned a null value.
io.reactivex.internal.functions.ObjectHelper.requireNonNull(ObjectHelper.java:39)
io.reactivex.internal.operators.observable.ObservableMap$MapObserver.onNext(ObservableMap.java:57)
retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:51)
retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:37)
retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:47)
Run Code Online (Sandbox Code Playgroud)
我的 logcat 不显示代码中断的位置。
public static Observable<List<Business.Response.Doc>> streamArticles_Business() {
NYT_TopStories_services nyt_services = NYT_TopStories_services.retrofit.create(NYT_TopStories_services.class);
return nyt_services.getArticles_Business()
.map(Business.Response::getDocs)
.filter(str -> str != null)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.timeout(20, TimeUnit.SECONDS);
}
Run Code Online (Sandbox Code Playgroud)
和我的改造得到
@GET("search/v2/articlesearch.json?q=business&api-key=" + apiKey)
Observable<Business.Response> getArticles_Business();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.nytimes.com/svc/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
Run Code Online (Sandbox Code Playgroud)
你有办法解决这个问题吗?
由于这是内部 RxJava 崩溃,因此您不会在代码中看到这一点,但是如果您遍历map{}
层次结构,您就会了解其背后的原因。
如果您使用空值进行映射,就会发生这种崩溃,基本上,如果语句变成这样,map{null}
它就会崩溃。解决此问题的一个简单方法是为所有可为空的类型设置默认值。
例如 :
map{nullableField ?: defaultValue}
Run Code Online (Sandbox Code Playgroud)