我有一个凌空的JSONRequest,它被卡住了,因为来自服务器的响应不是有效的JSON(它是html)。
如何才能优雅地处理此错误?我有以下实现:
JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
… something …
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// TODO Auto-generated method stub
Log.i(TAG,"error "+error.toString());
}
});
queue.add(jsObjRequest);
然而,当我发送请求并得到无效的JSON响应时,不会调用onErrorResponse。相反,我得到了一个例外
08-14 16:26:15.590: D/538 - JsonRequest(27888): exception error Value <!DOCTYPE of type java.lang.String cannot be converted to JSONObject
整个应用程序崩溃了。
我设法将该错误跟踪到JsonObjectRequest.java类中的以下行:
@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
try {
Log.d(TAG,"response headers "+response.headers.toString());
String jsonString =
new String(response.data, HttpHeaderParser.parseCharset(response.headers));
Log.d(TAG,"json string "+jsonString);
return Response.success(new JSONObject(jsonString),
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
Log.d(TAG,"parse error");
return Response.error(new ParseError(e));
} catch (JSONException je) {
Log.d(TAG,"exception error "+je.getLocalizedMessage());
return Response.error(new ParseError(je));
}
}
调用的行是:返回响应。错误(new ParseError(je));
我如何抓住它,这样它就不会崩溃的应用程序?
提前感谢!
} catch (JSONException je) {
Log.v("Volley", "JSONException " + response.statusCode);
if (response.statusCode == 200)// Added for 200 response
return Response.success(new JSONObject(),HttpHeaderParser.parseCacheHeaders(response));
else
return Response.error(new ParseError(je));
}
尝试添加此捕获
如果您希望获得JSON,那么应该检查URL是否有效。当请求无效时,通常返回HTML。例如,当请求返回404 not found网页时。
如果您试图获取HTML(或XML),可以使用StringRequest获取字符串,然后将其转换为XML文档,也可以使用SAXParser对其进行解析。例如:
StringRequest request = new StringRequest(Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
Document xml = factory.newDocumentBuilder().parse(response);
//TODO: handle XML Document parsing
} catch (Throwable t) {
return ;
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// TODO Auto-generated method stub
}
});
queue.add(request);
作为一种更简单的选择,您可能希望考虑的一件事是droidQuery。要使用droidQuery完成此请求,请执行以下操作:
$.ajax(new AjaxOptions().url(url)
.type("GET")
.dataType("XML")
//optionally, add own SAX parser with SAXContentHandler or customXMLParser methods
.success(new Function() {
@Override
public void invoke($ droidQuery, Object... params) {
Document xml = (Document) params[0];
//TODO: parse Document
}
})
.error(new Function() {
@Override
public void invoke($ droidQuery, Object... params) {
AjaxError error = (AjaxError) params[0];
Log.e("$", "Error " + error.status + ": " + error.error);
}
}));
我正在从服务器下载文件。我用排球来做。 这是我的代码 以下是错误侦听器的错误消息在一些弱网络连接上,我收到以下逻辑消息 我不明白失败的原因是什么,因为大多数错误消息都返回null。我很确定这是因为请求超时,我知道如何增加超时,但是我应该在错误侦听器中编写什么代码,以便在出现错误时获得正确的错误消息。
我从互联网上搜索了很多来设置凌空的请求超时。我最终得到了重试策略的解决方案,但当研究它不设置超时时,它会设置请求的重试时间,但我不想重试我的请求。我想增加凌空请求超时,以便较慢的网络可以访问数据,凌空超时设置为5秒,这意味着如果网络直到5秒才连接,它将抛出超时异常。我如何管理更改时间以从服务器获取响应。 我的代码是 我有两个问题-- (1) 它会在30秒后重试请求吗? (2)如何设置请求超时30秒
所以我想打印响应的结果,然后使用gson为模型生成数据,但响应永远不会得到返回,因为调用了onResponse。! 如果你注意到Logcat,日志。我的回答没有显示。。!?但是在使用该请求的活动的onSuccess中,它通常会显示日志,但是如果日志包含响应对象,它不会显示哪个非常奇怪,也没有任何意义。。!? Logcat公司 我尝试使用具有相同url和参数的PostMan测试请求,它通常返回jso
我使用的是volley.jar,在编译时没有错误,但是有运行时异常。 然后添加volley.jar和build path。什么是问题? CustomAdapter.java
问题内容: 我正在使用凌空特技从REST api解析电影详细信息,并将解析后的数据保存在一个名为detailsMovies的对象的Arraylist中。但是我无法在onResponse方法之外访问ArrayList。我是Android新手,所以我不知道该怎么做。任何帮助表示赞赏! 这是代码: 问题答案: 在您的课程中定义一个接口并实现它。 因此,这里的简单技巧是与回调接口。
关于在项目中使用截击,我有几个问题: 这个库可以在任何Java项目中使用,还是仅在Android中使用