Ma7*_*gar 18 android android-asynctask retrofit
对服务器的每个请求都可以返回error_code.当我使用AsyncTask时,我想在一个地方处理这些错误我有这样的BaseAsyncTask
public abstract class BaseAsyncTask<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> {
protected Context context;
private ProgressDialog progressDialog;
private Result result;
protected BaseAsyncTask(Context context, ProgressDialog progressDialog) {
this.context = context;
this.progressDialog = progressDialog;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onPostExecute(Result result) {
super.onPostExecute(result);
HttpResponse<ErrorResponse> response = (HttpResponse<ErrorResponse>) result;
if(response.getData().getErrorCode() != -1) {
handleErrors(response.getData());
}else
onResult(result);
}
private void handleErrors(ErrorResponse errorResponse) {
}
public abstract void onResult(Result result);
}
Run Code Online (Sandbox Code Playgroud)
但是,使用改造每个请求都有其错误处理回调:
git.getFeed(user,new Callback<gitmodel>() {
@Override
public void success(gitmodel gitmodel, Response response) {
}
@Override
public void failure(RetrofitError error) {
}
});
}
});
Run Code Online (Sandbox Code Playgroud)
如何在一个地方处理所有错误?
Mim*_*oli 18
如果你需要得到一些"逻辑"错误,那么你需要一些Java逻辑,因为它不是一个Retrofit功能,所以基本上:
MyCallback.java
import android.util.Log;
import retrofit.Callback;
import retrofit.client.Response;
public abstract class MyCallback<T extends MyObject> implements Callback<T> {
@Override
public final void success(T o, Response response) {
if (o.isError()) {
// [..do something with error]
handleLogicError(o);
}
else {
handleSuccess(o, response);
}
}
abstract void handleSuccess(T o, Response response);
void handleLogicError(T o) {
Log.v("TAG", "Error because userId is " + o.id);
}
}
Run Code Online (Sandbox Code Playgroud)
MyObject.java(从Retrofit获得的所有对象的基类)
public class MyObject {
public long id;
public boolean isError() {
return id == 1;
}
}
Run Code Online (Sandbox Code Playgroud)
MyRealObject.java - 扩展基础对象的类
public class MyRealObject extends MyObject {
public long userId;
public String title;
public String body;
}
Run Code Online (Sandbox Code Playgroud)
RetroInterface.java - 您应该熟悉的改造使用的界面
import retrofit.http.GET;
import retrofit.http.Path;
public interface RetroInterface {
@GET("/posts/{id}")
void sendGet(@Path("id") int id, MyCallback<MyRealObject> callback);
}
Run Code Online (Sandbox Code Playgroud)
最后是你使用所有逻辑的代码片段
RestAdapter adapter = new RestAdapter.Builder()
.setEndpoint("http://jsonplaceholder.typicode.com")
.build();
RetroInterface itf = adapter.create(RetroInterface.class);
itf.sendGet(2, new MyCallback<MyRealObject>() {
@Override
void handleSuccess(MyRealObject o, Response response) {
Log.v("TAG", "success");
}
@Override
public void failure(RetrofitError error) {
Log.v("TAG", "failure");
}
});
Run Code Online (Sandbox Code Playgroud)
如果您复制并粘贴此代码,那么当您执行itf.sendGet(1, new MyCallback..)并成功时,您将收到错误itf.sendGet(2, new MyCallback...)
不确定我是否理解正确,但您可以创建一个Callback并将其作为参数传递给您的所有请求.
代替:
git.getFeed(user,new Callback<gitmodel>() {
@Override
public void success(gitmodel gitmodel, Response response) {
}
@Override
public void failure(RetrofitError error) {
}
});
Run Code Online (Sandbox Code Playgroud)
首先定义你的回调:
Callback<gitmodel> mCallback = new Callback<gitmodel>() {
@Override
public void success(gitmodel gitmodel, Response response) {
}
@Override
public void failure(RetrofitError error) {
// logic to handle error for all requests
}
};
Run Code Online (Sandbox Code Playgroud)
然后:
git.getFeed(user, mCallback);
Run Code Online (Sandbox Code Playgroud)
在Retrofit中,您可以为所有请求指定ErrorHandler.
public class ApiErrorHandler implements ErrorHandler {
@Override
public Throwable handleError(RetrofitError cause) {
//here place your logic for all errors
return cause;
}
}
Run Code Online (Sandbox Code Playgroud)
将其应用于RestAdapter
RestAdapter.Builder()
.setClient(client)
.setEndpoint(endpoint)
.setErrorHandler(errorHandler)
.build();
Run Code Online (Sandbox Code Playgroud)
我认为这就是你要求的.
| 归档时间: |
|
| 查看次数: |
8933 次 |
| 最近记录: |