处理(全局)403错误和注销(关闭当前活动并打开活动)

时间:2018-06-04 13:22:51

标签: android retrofit okhttp3

我有两种错误。我自己从服务器和网络错误发送的那些。我从服务器发送的那些我在转换器中处理的内容:

public class RestResponseConverter<T> implements Converter<ResponseBody, T> {
    private final Converter<ResponseBody, RestResponse<T>> delegate;

    public RestResponseConverter(Converter<ResponseBody, RestResponse<T>> delegate) {
        this.delegate = delegate;
    }

    @Override
    public T convert(@NonNull ResponseBody responseBody) throws IOException {
        RestResponse<T> restResponse = delegate.convert(responseBody);
        if (restResponse.getError() != null) {
            throw new ApiNfpException(restResponse.getError().getMessage());
        }
        return restResponse.getResponse();
    }
}

对于networck例外,我有拦截器:

public class AuthHeaderInterceptor implements Interceptor {

    private final UserStorage userStorage;
    private final Context context;

    public AuthHeaderInterceptor(UserStorage userStorage, Context context) {
        this.userStorage = userStorage;
        this.context = context;
    }

    @Override
    public Response intercept(@NonNull Chain chain) throws IOException {
        String authToken = userStorage.getUserProfile().getAuthToken();
        Request request = chain.request().newBuilder().addHeader("X-Authorization", authToken).build();

        try {
            Response response = chain.proceed(request);
            if (response.code() == 401) {
                clearAuthUser();
                throw new IOException(context.getString(R.string.no_auth_token));
            }
            if (response.code() == 403) {
                clearAuthUser();
                throw new IOException(context.getString(R.string.wrong_auth_token));
            }
            return response;
        } catch (ConnectException e) {
            throw new IOException(context.getString(R.string.connection_error));
        } catch (SocketTimeoutException e) {
            throw new IOException(context.getString(R.string.timeout_exception));
        }
    }

    private void clearAuthUser() {
        Intent intent = new Intent(context, StartActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); // this will clear all the stack
        context.startActivity(intent);

        userStorage.clearUserProfile();
        new Thread(() -> {
            try {
                FirebaseInstanceId.getInstance().deleteInstanceId();
                FirebaseInstanceId.getInstance().getToken();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }).start();
    }
}

我需要处理403错误并注销。但我不喜欢这种实现。怎么做得更准确?

我可以处理onError回调中的错误吗?

0 个答案:

没有答案