Android - 大数据json下载

时间:2018-01-17 13:34:56

标签: android json web-services

我在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;
}

2 个答案:

答案 0 :(得分:1)

首先,不要将图像保存在表格中。将其保留在您的服务器空间中,并将URL保留在表中的图像中。当您需要加载图像时,请使用表中保存的URL加载它。

其次,JSON是一种轻量级数据交换格式。你应该限制它携带的物品数量。建议不要让它在表中携带多达一百行(转换为JSON时)。如果必须的话,先加载一点,再加载一点,直到它结束。这就是无限滚动背后的想法。

这样,它可以有效地加载您的数据。

答案 1 :(得分:0)

看起来你的json字符串对象没有正确形成。它可能在字符串末尾缺少双引号。检查参数字符串对象。