我正在改编一些来自三词地址的示例代码,以便通过他们的 Java SDK 访问他们的 API。它使用 RXJava。
示例代码是:
Observable.fromCallable(() -> wrapper.convertTo3wa(new Coordinates(51.2423, -0.12423)).execute())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(result -> {
if (result.isSuccessful()) {
Log.i("MainActivity", String.format("3 word address: %s", result.getWords()));
} else {
Log.e("MainActivity", result.getError().getMessage());
}
});
首先。这会在构建时发出弃用警告并发出 IDE 警告 ( Result of 'Observable.subscribe()' is ignored
)。
为了解决第一个问题,我Disposable myDisposable =
在Observable
. 这个对吗?(添加位置见下文)
接下来我需要添加一个超时,以便在请求超时时可以显示警告等。为此,我已添加.timeout(5000, TimeUnit.MILLISECONDS)
到构建器中。
这行得通,但timeout
s 似乎对Observable
s 起作用的方式是它们抛出异常,我不知道如何捕获和处理该异常。
我现在拥有的是:
Disposable myDisposable = Observable.fromCallable(() -> wrapper.convertTo3wa(new Coordinates(51.2423, -0.12423)).execute())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.timeout(5000, TimeUnit.MILLISECONDS)
.subscribe(result -> {
if (result.isSuccessful()) {
Log.i("MainActivity", String.format("3 word address: %s", result.getWords()));
} else {
Log.e("MainActivity", result.getError().getMessage());
}
});
这构建并运行良好,并且未显示 API/弃用警告,但是当没有可用网络时,此正确超时并引发未处理的异常。
所以,代码似乎是正确的,但究竟如何添加异常处理来捕获TimeoutException
抛出的超时?
我已经尝试了很多东西,包括:try-catch
在整体周围添加一个子句Observable
- 这会警告TimeoutException
`try; 中的代码不会抛出该警告;并添加一个错误处理程序。
添加错误处理程序让我最接近,所以下面的代码是我所得到的:
Disposable myDisposable = Observable.fromCallable(() -> wrapper.convertTo3wa(new Coordinates(51.2423, -0.12423)).execute())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.timeout(5000, TimeUnit.MILLISECONDS)
.subscribe(result -> {
if (result.isSuccessful()) {
Log.i("MainActivity", String.format("3 word address: %s", result.getWords()));
} else {
Log.e("MainActivity", result.getError().getMessage());
}
}, error -> {
runOnUiThread(new Runnable() {
@Override
public void run() {
myTextView.setText(R.string.network_not_available);
}
});
});
这会正确捕获超时并更新我的 UI 而不会出错,但是当网络恢复时,似乎 Observable 可能正在尝试返回并引发空指针异常。
(更新,无论网络是否恢复,这个NPE实际上可能会在短时间内被抛出......但它总是在网络恢复时抛出。)
我得到FATAL EXCEPTION: RxCachedThreadScheduler-1
并且java.lang.NullPointerException: Callable returned a null value. Null values are generally not allowed in 3.x operators and sources.
我是否需要销毁Observable
或其他东西来防止 NPE?