我在Android应用中面临一个问题,即无法从网络服务恢复大型json数据。 JSON数据很大,因为包含从我的数据库中的表中恢复的图像。
前几天一切正常,但是这个表中的寄存器数量快速增长,然后问题就出现了。
这个问题在iOS或Android模拟器上都没有发生,只是在真正的Android设备上。
代码突然停止下载并抛出错误
org.json.JSONException: Unterminated string at character <cccc> of <json data>
也就是说,代码不会下载整个JSON数据。此外,下载在不同的点停止我总是运行代码。
有人知道为什么会这样吗?
这是尝试从Web服务恢复数据的功能:
protected static JSONObject executeJSONQuery(ContentValues values,
WebServiceResolverCode code, Context context)
throws ContratoInativoException, JSONException {
URL url;
HttpURLConnection conn;
JSONObject jArray = null;
// build the string to store the response text from the server
String response = "";
try {
url = new URL(WebServiceResolver.getWebServiceSufix(code, context));
String param = "";
for (String key : values.keySet()) {
Object value = values.get(key);
param += key+"="+ URLEncoder.encode(value!=null?values.getAsString(key):"", "UTF-8")+"&";
}
conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setFixedLengthStreamingMode(param.getBytes().length);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
// send the POST out
OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream());
out.write(param);
out.flush();
out.close();
// start listening to the stream
Scanner inStream = new Scanner(conn.getInputStream());
while (inStream.hasNextLine()){
response += (inStream.nextLine());
}
inStream.close();
// process the stream and store it in StringBuilder
jArray = new JSONObject(response);
} catch (IOException ex) {
ex.printStackTrace();
Log.d("ERROR JSON STRING", response);
}
return jArray;
}
答案 0 :(得分:1)
首先,不要将图像保存在表格中。将其保留在您的服务器空间中,并将URL保留在表中的图像中。当您需要加载图像时,请使用表中保存的URL加载它。
其次,JSON是一种轻量级数据交换格式。你应该限制它携带的物品数量。建议不要让它在表中携带多达一百行(转换为JSON时)。如果必须的话,先加载一点,再加载一点,直到它结束。这就是无限滚动背后的想法。
这样,它可以有效地加载您的数据。
答案 1 :(得分:0)
看起来你的json字符串对象没有正确形成。它可能在字符串末尾缺少双引号。检查参数字符串对象。