Перехватите ошибку в 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 ответа

Решение

Вы должны бросить RetrofitError в fail ().

Я собирался прокомментировать ответ @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, как я упоминал ранее.

Другие вопросы по тегам