Android Volley возвращает нулевой ответ - PullRequest
2 голосов
/ 04 мая 2019

Я давно пользуюсь Volley, но в последнее время у меня возникает ошибка. Я перепробовал множество ответов на другие вопросы, но мне еще не повезло.

В моем проекте у меня есть приложение для Android и бэкэнд-сервер. Все звонки, кажется, работают нормально, пока я не доберусь до этого:

    private void getUserData() {
    APICommunicator apiCommunicator = new APICommunicator();
    Response.Listener responseListener = new Response.Listener<CustomRequest.CustomResponse>() {
        @Override
        public void onResponse(CustomRequest.CustomResponse response) {
            //do something

        }
    };
    Response.ErrorListener errorListener = new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

                errorTreatment(error.networkResponse.statusCode);

        }
    };
    String email = SharedPreferencesManager.INSTANCE.read(getApplicationContext(), "user_email");
    Context applicationContext = this;
    Map<String, Object> params = new HashMap<>();
    apiCommunicator.getRequest(applicationContext, URL + "/" + email, responseListener, errorListener, params);
}

Этот вызов выполняется в методе onCreate() из Activity, доступ к которому осуществляется сразу после входа в систему, поэтому электронная почта из SharedPreferences не null (уже проверена). Проблема в том, что время от времени, обычно после того, как я отправляю на сервер новую версию кода бэкэнда, вызов возвращает NullPointerException. Это происходит в errorTreatment(error.networkResponse.statusCode); и я знаю, что это будет решено, попробуйте / поймайте этот доступ, но я не понимаю, почему я получаю эту ошибку, когда сервер работает нормально (через postgres). Обычно проблема решается, когда я ничего не делаю, просто подожду некоторое время (возможно, перерыв на обед).

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

Код APICommunicator:

    class APICommunicator {

    private static final String API_URL = BuildConfig.API_ENDPOINT;
    private static final String CONTENT_TYPE = "application/json; charset=utf-8";
    private static final String CHARSET = "utf-8";


    void getRequest(Context context, String url, Response.Listener responseListener, Response.ErrorListener errorListener, final Map<String, Object> params) {
        doRequest(context, Request.Method.GET, url, responseListener, errorListener, params);
    }



    private void doRequest(final Context context, final int method, final String url, final Response.Listener responseListener, final Response.ErrorListener errorListener, final Map<String, Object> params) {
        CustomRequest request = new CustomRequest(method, API_URL + url, responseListener, errorListener) {
            @Override
            public byte[] getBody() {
                try {
                    return new JSONObject(params).toString().getBytes(CHARSET);
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                    return null;
                }
            }

            @Override
            public Map<String, String> getHeaders() {
                Map<String, String> headers = new HashMap<>();
                String token = SharedPreferencesManager.INSTANCE.read(context, "token");
                if (token != null) headers.put("Authorization", token);
                return headers;
            }

            @Override
            public String getBodyContentType() {
                return CONTENT_TYPE;
            }
        };
        request.setRetryPolicy(new DefaultRetryPolicy(
                10000,
                3,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        Volley.newRequestQueue(context).add(request);
    }
}

Надеюсь, вы сможете мне помочь.

РЕДАКТИРОВАТЬ: Журнал трассировки стека выглядит следующим образом

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.JoanSanchez.project, PID: 13258
java.lang.NullPointerException: Attempt to read from field 'int com.android.volley.NetworkResponse.statusCode' on a null object reference
    at com.JoanSanchez.project.InsideActivity$3.onErrorResponse(InsideActivity.java:190)
    at com.android.volley.Request.deliverError(Request.java:617)
    at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:104)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6863)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:537)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

Строка 190 - errorTreatment(error.networkResponse.statusCode);

...