我试图发送一个GET请求,传递一个身份验证令牌标头来获取一些JSON数据但是我在整个地方都得到了java.lang.NullPointerExceptions。我已经尝试过使用JSONObjectRequest,JSONArrayRequest甚至作为StringRequest。
这里是代码(JSONObjectRequest和JSONArrayRequest被评论用于测试):
public void getJSON() {
final String authToken = getAuth();
String novaURL = getNova();
novaURL = novaURL+"/servers";
/**
___________________________________________________________________
JsonArrayRequest getRequest = new JsonArrayRequest(novaURL,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
Log.d("Nova", response.toString());
setNovaJSON(response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d("Nova", "Error: " + error.getMessage());
}
}
){
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put("X-Auth-Token", authToken);
params.put("Accept", "application/json");
params.put("Content-Type", "application/json; charset=utf-8");
return params;
}
};
RequestQueue queue = Volley.newRequestQueue(this);
queue.add(getRequest);
}
JsonObjectRequest getRequest = new JsonObjectRequest(Request.Method.GET, novaURL, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray servers = response.getJSONArray("servers");
} catch (JSONException e) {
Toast.makeText(getApplicationContext(), "Error to get Instances", Toast.LENGTH_LONG).show();
e.printStackTrace();
}
Log.d("Nova", response.toString());
setNovaJSON(response.toString());
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d("Nova", "Error: " + error.getMessage());
}
}
) {
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put("X-Auth-Token", authToken);
params.put("Accept", "application/json");
params.put("Content-Type", "application/json; charset=utf-8");
return params;
}
};
________________________________________________________________ **/
StringRequest getRequest = new StringRequest(Request.Method.GET,
novaURL, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d("Nova", response.toString());
setNovaJSON(response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d("Nova", "Error: " + error.getMessage());
}
}) {
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put("X-Auth-Token", authToken);
params.put("Accept", "application/json");
params.put("Content-Type", "application/json; charset=utf-8");
return params;
}
};
RequestQueue queue = Volley.newRequestQueue(this);
queue.add(getRequest);
}
此行发生异常:
RequestQueue queue = Volley.newRequestQueue(this);
11-20 13:44:28.623 14599-14599 / com.x.app D / AndroidRuntime:关闭VM 11-20 13:44:28.623 14599-14599 / com.x.app W / dalvikvm:threadid = 1:线程退出未捕获异常(组= 0x41642ce0) 11-20 13:44:28.643 14599-14599 / com.x.app E / AndroidRuntime:FATAL EXCEPTION:main 过程:com.stackerz.app,PID:14599 显示java.lang.NullPointerException 在android.content.ContextWrapper.getCacheDir(ContextWrapper.java:230) 在com.android.volley.toolbox.Volley.newRequestQueue(Volley.java:43) 在com.android.volley.toolbox.Volley.newRequestQueue(Volley.java:78)
很难找到发生了什么,因为错误不是很具描述性。如果它太明显,我会事先道歉但这是我的第一个应用程序而且我无法让它工作。我真的很感激一些帮助。
**更新:
我可能找到了一些有用的东西。我移动了行#34; RequestQueue queue = Volley.newRequestQueue(this);&#34;使用其他变量声明到方法的顶部,在调试之后,它甚至在获取JSONObjectRequest或StringRequest命令之前就崩溃了。似乎队列存在问题。
** UPDATE2:
我设法修复队列问题,添加一个扩展Application的Singleton类(也必须按照此处的步骤将其添加到Manifest作为Application而不是Activity):https://developer.android.com/training/volley/requestqueue.html
但是我仍然有例外:
java.lang.NullPointerException
at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116)
at org.json.JSONTokener.nextValue(JSONTokener.java:94)
at org.json.JSONObject.<init>(JSONObject.java:155)
at org.json.JSONObject.<init>(JSONObject.java:172)
在调试期间,我注意到它直接从&#34; getRequest&#34;声明(无论是JSONObjectRequest,JSONArrayRequest还是StringRequest)到Response.ErrorListener()。看起来它甚至没有尝试连接到URL。我测试了从REST浏览器到URL的连接,并确认它工作正常,生成JSON输出。
答案 0 :(得分:2)
似乎 Volley.newRequestQueue(this)&#34; s&#34;这&#34;是空的。
答案 1 :(得分:0)
所有修复添加Singleton类扩展Application(也必须将其添加到Manifest作为Application而不是Activity),遵循以下步骤:https://developer.android.com/training/volley/requestqueue.html
导致另一个异常是因为凌空上的异步连接花费的时间太长。我通过在应用程序的加载中调用该方法来修复,为抽射提供时间来完成它。
答案 2 :(得分:0)
代码必须有问题
Volley.newRequestQueue(this)
方法签名是bolow:
public static RequestQueue newRequestQueue(Context context) {
return newRequestQueue(context, null);
}
因此,您传递的内容应该是一个像活动实例或应用程序上下文的上下文。应用程序上下文要好得多。
答案 3 :(得分:0)
在manifestast应用程序标记中添加单例类名称
Singleton Class
class VolleyApplication extends Application {
----
----
}
的 Manifeast 强>
<application
android:name=".VolleyApplication" --> Add this line
...>
...
</application>