我正在使用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吗?
答案 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中打包,如前所述。