改造和集中错误处理

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功能,所以基本上:

  1. 创建一个实现Retrofit Callback的实现回调
  2. 创建一个定义方法'isError'的基础对象
  3. 修改Retrofit RestAdapter以获取Callback而不是Retrofit One

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...)


Teo*_*nke 7

不确定我是否理解正确,但您可以创建一个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)


jak*_*ski 6

在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)

我认为这就是你要求的.