Неожиданный конец потока Android при потоковой передаче JSON

Итак, у меня есть фрагмент кода, в котором я звоню на сервер, чтобы получить большой файл JSON (около 2 МБ), и анализирую его с помощью 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();
    }
}

person Sphig316    schedule 20.08.2014    source источник


Ответы (2)


Итак, я понял решение. Похоже, то, как я подключался к своему серверу, было плохим. Я нашел этот фрагмент кода для получения ответов 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);
person Sphig316    schedule 21.08.2014

Подробная информация о приостановке/возобновлении загрузки файла приведена здесь.

Приостановить/возобновить загрузку HTTP-соединения

Примечание. Если вы считаете, что проблема связана с подключением эмулятора к Интернету, вы можете запустить свой apk на своем мобильном телефоне, включив параметры разработчика в настройках.

person Hrushi    schedule 20.08.2014
comment
Извините, я не хотел ставить скачать. Я вообще ничего не скачиваю. Я делаю прямую трансляцию, где я читаю часть JSON, затем сохраняю ее в переменной, затем перехожу к следующей части, пока не дойду до конца массива JSON. - person Sphig316; 20.08.2014
comment
не могли бы вы опубликовать исключение и фрагмент кода, который вы используете. Было бы полезно разобраться в этом вопросе и решить его. - person Hrushi; 20.08.2014
comment
Я просто поместил свой метод, который я использую для потоковой передачи JSON. - person Sphig316; 20.08.2014
comment
Не очень уверен, в чем здесь может быть проблема. Код выглядит нормально. Также согласно документации входные и выходные потоки, возвращаемые этим классом, не буферизуются. Если вы читаете фрагменты данных, вы должны обернуть потоки с помощью BufferedInputStream. Не могли бы вы попробовать и проверить результат. Буферизация может помочь избежать этой проблемы. Ссылка на документацию: developer.android.com/reference/java/net/HttpURLConnection.html - person Hrushi; 21.08.2014