【问题标题】:Android "unexpected end of stream" when streaming JSON流式传输 JSON 时 Android“意外结束流”
【发布时间】:2014-10-14 03:50:00
【问题描述】:

所以我有一段代码,我正在调用服务器以获取一个大的 JSON 文件(大约 2MB)并使用 Jackson JSON Parser 解析它。代码运行良好,但问题是我有时会收到 IOException “意外结束流”。所以我猜我在流式传输过程中失去了我的模拟器上的连接。无论如何我可以暂停流并恢复它吗?或者重新连接然后恢复流?谢谢。

private void createDatabase(String downloadUrl)
{
    editor = sharedPref.edit();

    String fieldName = "";
    long id = 0;
    String setNumber = "";
    String cardName = "";
    String type = "";
    String attribute = "";
    String level = "";
    String category = "";
    String attack = "";
    String defense = "";
    String description = "";

    try
    {
        if (isOnline())
        {
            url = new URL(downloadUrl);
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();

            jsonfactory = new JsonFactory();
            jsonParser = jsonfactory.createParser(connection.getInputStream());

            while (jsonParser.nextToken() != JsonToken.END_ARRAY)
            {
                if (jsonParser.getCurrentToken() == JsonToken.FIELD_NAME)
                {
                    fieldName = jsonParser.getCurrentName();

                    // if (fieldName.equals("id"))
                    // {
                    // jsonParser.nextToken();
                    // id = jsonParser.getIntValue();
                    // }

                    if (fieldName.equals("Set_Number"))
                    {
                        jsonParser.nextToken();
                        setNumber = jsonParser.getText();
                    }

                    else if (fieldName.equals("Card_Name"))
                    {
                        jsonParser.nextToken();
                        cardName = jsonParser.getText();
                    }

                    else if (fieldName.equals("Type"))
                    {
                        jsonParser.nextToken();
                        type = jsonParser.getText();
                    }

                    else if (fieldName.equals("Attribute"))
                    {
                        jsonParser.nextToken();
                        attribute = jsonParser.getText();
                    }

                    else if (fieldName.equals("Level"))
                    {
                        jsonParser.nextToken();
                        level = jsonParser.getText();
                    }

                    else if (fieldName.equals("Category"))
                    {
                        jsonParser.nextToken();
                        category = jsonParser.getText();
                    }

                    else if (fieldName.equals("Attack"))
                    {
                        jsonParser.nextToken();
                        attack = jsonParser.getText();
                    }

                    else if (fieldName.equals("Defense"))
                    {
                        jsonParser.nextToken();
                        defense = jsonParser.getText();
                    }

                    else if (fieldName.equals("Description"))
                    {
                        jsonParser.nextToken();
                        description = jsonParser.getText();
                    }
                }

                else if (jsonParser.getCurrentToken() == JsonToken.END_OBJECT)
                {
                    id = db.insert(setNumber, cardName, type, attribute, level, category, attack, defense, description);
                    editor.putLong("lastId", id);
                    editor.commit();
                }
            }
        }
    }

    catch (IOException e)
    {
        e.printStackTrace();
    }

    catch (Exception e)
    {
        e.printStackTrace();
    }

    finally
    {
        if (connection != null)
            connection.disconnect();

        if (jsonParser != null)
        {
            try
            {
                jsonParser.close();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }

    Log.d("lastID", "" + sharedPref.getLong("lastId", -1));
    if (sharedPref.getLong("lastId", -1) == 5980)
    {
        editor.putBoolean("databaseExists", true);
        editor.commit();
    }
}

【问题讨论】:

    标签: android json stream ioexception


    【解决方案1】:

    所以我想出了解决方案。看起来我连接到服务器的方式很糟糕。我找到了这段代码来获取 HTTP GET 响应并从中创建了一个 InputStream 并且它可以工作。祝其他尝试做同样事情的人好运。

            HttpClient httpclient = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(downloadUrl);
            HttpResponse response = httpclient.execute(httpGet);
            HttpEntity entity = response.
            InputStream is = entity.getContent();
    
            jsonfactory = new JsonFactory();
            jsonParser = jsonfactory.createParser(is);
    

    【讨论】:

      【解决方案2】:

      此处提到了有关暂停/恢复文件下载的详细信息。

      Pause/Resume http connection download

      注意: 如果您认为这是模拟器与互联网连接的问题,那么您也可以通过在设置下启用开发者选项来在手机上运行您的 apk。

      【讨论】:

      • 对不起,我不是故意放下载的。我实际上没有下载任何东西。我正在做一个实时流,我读取 JSON 的一部分,然后将其保存在一个变量中,然后转到下一部分,直到我到达 JSON 数组的末尾
      • 能否请您发布您正在使用的异常和代码 sn-p。了解并解决此问题会很有帮助。
      • 我只是把我用来流式传输 JSON 的方法放了
      • 不太确定这里可能是什么问题。代码看起来不错。同样根据文档,此类返回的输入和输出流没有缓冲。如果您正在读取数据块,您应该使用 BufferedInputStream 包装流。您能否尝试一下并检查结果。缓冲可能有助于避免此问题。文档链接:developer.android.com/reference/java/net/HttpURLConnection.html
      猜你喜欢
      • 2014-03-19
      • 2011-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多