Перехватите ошибку в RetrofitError и передайте ее в RoboSpice Error
Я использую модуль Retrofit, предоставленный Robospice. Я делаю асинхронные вызовы дооснащения. Проблема заключается в том, что если мой вызов не удался, я получаю ошибку Retrofit, но в robospice я получаю обратную связь в onSuccess, а не в onFailure(RobospiceException).
Я использую следующий код для выполнения моего вызова веб-службы.
mSpiceManager.execute(mProfileRequest, new ProfileRequestListener());
Вызов loaddatafromnetwork в ProfileRequest выглядит следующим образом:
@Override
public Profile loadDataFromNetwork() throws Exception {
initCountDownLatch();
//Adding a retrofit callback.
getService().getProfile("//profileid", new AbstractCallback<Profile>() {
@Override
public void success(Profile profile, Response response) {
super.success(profile, response);
ProfileRequest.this.profile = profile;
mCountDownLatch.countDown();
}
@Override
public void failure(RetrofitError retrofitError) {
super.failure(retrofitError);
mCountDownLatch.countDown();
}
});
mCountDownLatch.await();
return profile;
}
Кто-нибудь может дать мне знать, как Robospice видит, что происходит при отказе? Проще говоря, кто-нибудь пробовал внедрить robospice с модификацией "Асинхронные вызовы"(с осуществленным обратным вызовом Retrofit ")?
2 ответа
Я собирался прокомментировать ответ @Snicolas, но у меня не было точек повторения.
Я полагаю, что @Snicolas говорит, что если вы сгенерируете исключение, RoboSpice поймает его и упакует в SpiceException. Вы должны иметь возможность получить доступ к RetrofitError с помощью getCause()
метод:
mySpiceException.getCause()
и вы можете попробовать выдать RetrofitError следующим образом:
@Override
public Profile loadDataFromNetwork() throws Exception {
initCountDownLatch();
RetrofitError myRetrofitError = null;
//Adding a retrofit callback.
getService().getProfile("//profileid", new AbstractCallback<Profile>() {
@Override
public void success(Profile profile, Response response) {
super.success(profile, response);
ProfileRequest.this.profile = profile;
mCountDownLatch.countDown();
}
@Override
public void failure(RetrofitError retrofitError) {
super.failure(retrofitError);
mCountDownLatch.countDown();
myRetrofitError = retrofitError;
}
});
mCountDownLatch.await();
if (null != myRetrofitError) {
throw myRetrofitError;
}
return profile;
}
Кроме того, почему вы используете форму обратного вызова для модернизации вызовов? Существуют синхронные версии модифицированных вызовов, так что вы можете сделать это:
@Override
public Profile loadDataFromNetwork() throws Exception {
Profile profile = getService().getProfile("//profileid");
ProfileRequest.this.profile = profile;
return profile;
}
Все, что вам нужно сделать, это использовать аннотации Gson в вашем классе Profile, чтобы Retrofit знал, как десериализовать ответ сервера. Модификация автоматически создаст экземпляр экземпляра профиля и настроит его. Тогда вы можете просто вернуть его. Если Retrofit обнаружит ошибку в этом процессе, он выдаст исключение... тогда, поскольку вы не перехватываете RetrofitError, оно всплывает и упаковывается в исключение SpiceException, как я упоминал ранее.