在RetrofitError中捕获错误并将其传递给RoboSpice错误

时间:2014-10-29 11:31:14

标签: android retrofit robospice

我正在使用Robospice提供的Retrofit模块。我正在进行异步改装调用。问题是如果我的调用不成功,我会得到一个Retrofit Error但是在robospice中我得到了onSuccess的反馈而不是onFailure(RobospiceException)。

我使用以下代码执行我的webservice调用。

mSpiceManager.execute(mProfileRequest, new ProfileRequestListener());

ProfileRequest中的loaddatafromnetwork调用如下:

@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如何看待失败?简单来说,任何人都试图通过改造“异步调用”(实施Retrofit回调)来实施robospice吗?

2 个答案:

答案 0 :(得分:1)

你应该将RetrofitError置于失败状态()。

答案 1 :(得分:1)

我打算对@Skicolas的回答发表评论,但我没有得到回复。

我相信@Snicolas所说的是,如果你抛出异常,那么RoboSpice会捕获它并将其打包在SpiceException中。您应该能够使用getCause()方法访问RetrofitError:

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;
}

您需要做的就是在Profile类上使用Gson注释,以便Retrofit知道如何反序列化服务器响应。 Retrofit将自动实例化和配置Profile实例。然后你就可以退货了。如果Retrofit在此过程中遇到错误,它将抛出异常...然后因为你没有捕获RetrofitError,它会冒泡并在SpiceException中打包,如前所述。