Ошибка залпа, централизованное управление ошибками - PullRequest
1 голос
/ 28 июня 2019

Я должен открыть активность входа в систему, если сервер возвращает ошибку 401, вместо перехвата типа ошибки при любом вызове, подобном этому, возможно ли централизовать управление ошибками в уникальной точке?

@Override
public void onErrorResponse(VolleyError error) {

    if (error instanceof TimeoutError || error instanceof NoConnectionError) {
        Toast.makeText(context,
                context.getString(R.string.error_network_timeout),
                Toast.LENGTH_LONG).show();
    } else if (error instanceof AuthFailureError) {
        //TODO
    } else if (error instanceof ServerError) {
       //TODO
    } else if (error instanceof NetworkError) {
      //TODO
    } else if (error instanceof ParseError) {
       //TODO
    }
}

я попытался реализовать мою пользовательскую ретриполицию

@Override
    public void retry(VolleyError error) throws VolleyError {

        //HTTP 401 and 403
        if (error instanceof AuthFailureError) {
            AuthFailureError er = (AuthFailureError) error;

            //HTTP 401
            if (er.networkResponse.statusCode == HttpURLConnection.HTTP_UNAUTHORIZED) {


                  Intent intent = new Intent(context, LoginActivity.class);
                                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                  context.startActivity(intent);
            }
            else {
                  request.deliverError(er);
            }
       }
  }

но ошибка 401 по-прежнему передается в событие onErrorResponse.

1 Ответ

1 голос
/ 05 июля 2019

Попробуйте расширить com.android.volley.Request, чтобы создать собственный класс, чтобы сделать это: это называется пользовательским запросом Volley. Затем переопределите требуемый метод, а также переопределите parseNetworkResponse(), чтобы сделать что-то вроде этого

@Override
    protected Response parseNetworkResponse(NetworkResponse response) {
        if (response.statusCode == HttpURLConnection.HTTP_UNAUTHORIZED) {
            /* go to login */
        }  
    }

Это должно сделать это.

...