【发布时间】:2017-08-25 16:54:05
【问题描述】:
在我的 Android 应用程序中,我使用 Retrofit 2.2 和 RxJava 2 进行网络调用。当设备连接到网络时,一切都很好。 当我禁用移动和 wifi 网络时,应用程序崩溃。 奇怪的是,我可以正确处理错误,但应用程序还是崩溃了。
这是 Retrofit 的 API 接口:
public interface BackendApi {
@GET("v1/users/{uuid}")
Observable<User> getUser(@Path("uuid") String userUuid);
}
以下方法返回一个 Observable,它将在我的视图模型中订阅。
@Override
public Observable<User> getUser(@NonNull final UUID id) {
return api.getUser(id.toString()).map(user -> mapUser(user));
}
在视图模型中我订阅了 Observable:
compositeDisposable.add(userService.getUser(userId)
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::onGetUser, this::onGetUserError));
以下几行显示错误处理方法
private void onGetUserError(final Throwable throwable) {
log.error("onGetUserError, getting user failed because of {}",
throwable.getCause());
if (isViewAttached()) {
getView().showUserLoginOrRegisterError();
}
}
问题是,当我断开设备与移动设备和 wifi 连接的连接时,onGetUserError() 方法会被正确调用,但无论如何都会有一个未处理的异常导致我的应用程序崩溃。
这是完整的堆栈跟踪:
https://gist.github.com/anonymous/859ab3811a3ca5c63998a40b877c41bb
我不知道如何摆脱这些崩溃!!
问候 马丁
---------更新 03.04.2017--------- 还有一个谜团…… 在三星 Galaxy (S5) 上,堆栈跟踪是相同的,但它是在我的错误处理程序方法中打印的!所以我能够正确地捕捉和处理异常。
04-03 12:36:46.014 12078-12078/at.xxxx.yyyyapp
E/at.xxxx.yyyyapp.ui.startup.viewmodel.StartupViewModelImpl:
onGetUserError, getting user failed because of {}
android.system.GaiException: android_getaddrinfo failed: EAI_NODATA (No
address associated with hostname)
at libcore.io.Posix.android_getaddrinfo(Native Method)
at libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:55)
at java.net.InetAddress.lookupHostByName(InetAddress.java:451)
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
at java.net.InetAddress.getAllByName(InetAddress.java:215)
at okhttp3.Dns$1.lookup(Dns.java:39)
at okhttp3.internal.connection.RouteSelector.resetNextInetSocketAddress(RouteSelec
tor.java:170)
at
okhttp3.internal.connection.RouteSelector.nextProxy(RouteSelector.java:136)
在我的其他测试设备(Nexus 5 和 6P)上,我的错误处理程序方法被调用,但应用程序仍然崩溃。
我不知道如何解决这个问题!
【问题讨论】:
-
你需要处理拦截器抛出的异常。在这里查看我的答案stackoverflow.com/questions/58697459/…
标签: java android crash retrofit2 rx-java2