Android-大数据json下载

Posted

技术标签:

【中文标题】Android-大数据json下载【英文标题】:Android - large data json download 【发布时间】:2018-06-26 09:54:32 【问题描述】:

我在我的 android 应用中遇到了一个问题,即无法从 Web 服务中恢复大型 json 数据。 JSON 数据很大,因为包含从我的数据库中的表中恢复的图像。

前几天一切正常,但是这个表中的寄存器数量增长很快,然后问题就出现了。

这个问题不会在 ios 或 Android 模拟器上发生,而是在真正的 Android 设备上发生。

代码突然停止下载并抛出错误

org.json.JSONException: Unterminated string at character <cccc> of <json data>

也就是说,代码并没有下载整个 JSON 数据。此外,下载停止在不同的点总是我运行代码。

有人知道为什么会这样吗?

这是尝试从网络服务恢复数据的功能:

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;

【问题讨论】:

那个json有多大? OOM 可能吗? +egold 或多或少 20MB 您的 Json 太大,即使您设法下载它,解码时也可能会出现 Out Of Memory 异常。您可能应该为这些图像添加一个 url,而不是它们的实际数据。不要忘记您的应用可以使用的 RAM 数量有限 我必须同意,你绝对应该延迟加载这些图片 【参考方案1】:

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

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

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

【讨论】:

非常感谢!我相信将图像保存在我的服务器中并仅将 URL 保存在桌面上是最好的方法:)。【参考方案2】:

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

【讨论】:

以上是关于Android-大数据json下载的主要内容,如果未能解决你的问题,请参考以下文章

数据库大作业—— Android studio连接SQLserver数据库登录界面

数据库大作业—— Android studio连接SQLserver数据库登录界面

数据库大作业—— Android studio连接SQLserver数据库登录界面

数据库大作业—— Android studio连接SQLserver数据库登录界面

R语言 | json数据是个大难题!

大数据:Android职位统计(20170519)