use*_*009 4 java error-handling android retrofit
我将我的Retrofit代码包装在如下所示的类中.如果从我发布的代码中不清楚它与OAuth的一个宁静服务进行交互.
什么是做错误处理的好方法?REST服务器以json格式返回错误消息.我想通过从我的班级中抛出一些例外来对该信息采取行动.我正在尝试做类似下面的事情.但这是一个好的设计吗?混合回调和异常是一个好主意吗?有没有更好的办法?
通过下面的方法,我可以从我的自定义异常中获取i18l消息,并将它们提供给用户.
public class RestClient implements IRestClient {
private IRestAPI api;
/**
*
* @param accessToken
*/
public RestClient(final String accessToken)
{
RequestInterceptor requestInterceptor = new RequestInterceptor()
{
@Override
public void intercept(RequestFacade request) {
request.addHeader("Authorization", "Bearer " + accessToken);
}
};
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(Config.ENDPOINT)
.setRequestInterceptor(requestInterceptor)
.build();
api = restAdapter.create(IRestAPI.class);
}
@Override
public void requestSomething(final Callback callback) {
api.getSomething(new Callback<Something>() {
@Override
public void success(Something something, Response response) {
callback.success(something, response);
}
@Override
public void failure(RetrofitError error) {
if(error.getMessage().getId().euqals(ACCESS_TOKEN_EXPIRED))
{
throw new AccessTokenExpired();
}
else if(error.getMessage().getId().euqals(USER_NOT_FOUND))
{
throw new UsernamePasswordNotFound();
}
else // something else happened...
{
throw error;
}
}
});
}
@Override
public void deleteSomething(final Callback callback) {
api.deleteSomething(new Callback<Something>() {
@Override
public void success(Something something, Response response) {
callback.success(something, response);
}
@Override
public void failure(RetrofitError error) {
if(error.getMessage().getId().euqals(SOMETHING_NOT_FOUND))
{
...
...
Different exceptions
}
...
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
当然,我只需要一个成功的方法来创建我自己的回调接口.
当你建立了RestAdapter,你可以提供一个错误处理程序映射出你的自定义异常,它绕过调用failure的Callback<T>任何东西的4xx/5xx系列.作为一个真正做作的例子:
public class Scratch {
public static void main(String[] args) {
Endpoints e = new RestAdapter.Builder()
.setEndpoint("http://google.com")
.setLogLevel(RestAdapter.LogLevel.FULL)
.setErrorHandler(new ErrorHandler() {
@Override
public Throwable handleError(RetrofitError cause) {
switch (cause.getResponse().getStatus()) {
case 400:
/* Handle the expected body format */
cause.getBody();
throw new RuntimeException("Bad Request");
default:
/* Things and stuff */
throw new RuntimeException("");
}
}
})
.build()
.create(Endpoints.class);
e.getGoogle(new Callback<Response>() {
@Override
public void success(Response response, Response response2) {
System.out.println("Got it");
}
@Override
public void failure(RetrofitError error) {
System.err.println("This won't ever be seen due to the error handler.");
}
});
}
private static interface Endpoints {
@GET("/foo/bar")
void getGoogle(Callback<Response> callback);
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:然而,通过这样做,你可能会牺牲一个很大的原因,你为什么要使用Callback界面开始.如果这是您需要的常用用法,则使用同步调用并返回对象类型可能更有意义.我不完全知道你的用处,说这是必要的,但似乎它可能更合适.
| 归档时间: |
|
| 查看次数: |
11092 次 |
| 最近记录: |