Я давно пользуюсь 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);