我已经使用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()
的{{1}}方法中,因此来自Activity
的电子邮件不是SharedPreferences
(已选中)。问题在于,通常我不时将新版本的后端代码推送到服务器后,调用会返回null
。这发生在NullPointerException
中;行,我知道尝试/捕获此访问权限将解决此问题,但是我不明白的是为什么服务器运行正常时(通过postgres)我会收到此错误。通常情况下,无需我做任何事情即可解决问题,只需等待一段时间(也许是午休时间)。
我还检查了是否由服务器决定(无明显原因)不回应这些请愿书,但是问题是服务器未收到任何请求,因此我怀疑问题出在我的Android设备上代码。
errorTreatment(error.networkResponse.statusCode)
的代码:
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);
}
}
第190行是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)