Android HttpURLConnection, загружает только первый символ 4066 и прерывает запрос

#java #android

#java #Android

Вопрос:

Проблема в том, что я не получаю полного результата. И только некоторую часть, которая не является частью продаж, и первые символы 4066.Проблема та же, исключение IOException, похоже, не вызвано

 private class GetContent extends AsyncTask<Void, Void, String>{

    HttpURLConnection urlConnection = null;
    BufferedReader reader = null;
    String resultJson = "";

    @Override
    protected String doInBackground(Void... params) {

        try{
            URL url = new URL("http://www.json-generator.com/api/json/get/bSFiRdwiSq?indent=2");

            urlConnection = (HttpURLConnection)url.openConnection();
            urlConnection.setRequestMethod("GET");
            urlConnection.connect();

            InputStream inputStream = urlConnection.getInputStream();
            StringBuffer buffer = new StringBuffer();

            reader = new BufferedReader(new InputStreamReader(inputStream));

            String line;
            while ((line = reader.readLine()) != null){
                buffer.append(line);
            }

            resultJson = buffer.toString();

            Log.d("Result:", resultJson);

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

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

        return null;
    }
}`
  

Результат

D/RESULT:: [ { "guid": "fdaefcc1-6469-4e3a-9d03-722f8de768d9", "index": 0, "favoriteFruit": "banana", "latitude": 52.644930000000002, "company": "DECRATEX", "email": "jodiecollier@decratex.com", "picture": "http://placehold.it/32x32", "tags": [ "esse", "tempor", "fugiat", "labore", "eu", "aliquip", "fugiat" ], "registered": "2015-06-07T09:21:48 -06:00", "eyeColor": "blue", "phone": " 1 (870) 541-3015", "address": "503 Rugby Road, Defiance, Alaska, 2923", "friends": [ { "id": 0, "name": "Melton Reese" }, { "id": 1, "name": "Sara Gilbert" }, { "id": 2, "name": "Nicholson Weber" } ], "isActive": false, "about": "Fugiat Lorem mollit in pariatur incididunt est cupidatat veniam sit officia. Dolor dolor velit ex fugiat dolore officia enim quis in pariatur do ea. Ipsum cillum duis aliquip ut occaecat qui sint est aliqua consequat reprehenderit non. Velit pariatur aute voluptate minim in deserunt amet duis laborum laborum amet. Fugiat nostrud culpa ipsum Lorem proident pariatur aliqua fugiat culpa. Et aliquip magna exercitation ipsum aute voluptate. Dolore magna sint duis ipsum eu consectetur.rn", "balance": "$3,384.03", "name": "Jodie Collier", "gender": "female", "age": 27, "greeting": "Hello, Jodie Collier! You have 3 unread messages.", "longitude": 173.90763799999999, "_id": "58046a786230071a551569b9" }, { "guid": "badaf4d6-54fa-46e3-8a6d-6b6997483b00", "index": 1, "favoriteFruit": "strawberry", "latitude": 39.709885, "company": "DRAGBOT", "email": "alstonmays@dragbot.com", "picture": "http://placehold.it/32x32", "tags": [ "elit", "ea", "ipsum", "velit", "amet", "laborum", "duis" ], "registered": "2016-06-01T05:06:26 -06:00", "eyeColor": "green", "phone": " 1 (911) 423-3011", "address": "248 Forbell Street, Mathews, Vermont, 4994", "friends": [ { "id": 0, "name": "Liza Day" }, { "id": 1, "name": "Catherine Palmer" }, { "id": 2, "name": "Beryl Conway" } ], "isActive": false, "about": "Proident id fugiat pariatur et incididunt commodo est irure in duis ullamco veniam est magna. Id enim qui commodo exercitation labore adipisicing excepteur adipisicing dolor veniam. Qui quis minim commodo mollit est sit.rn", "balance": "$1,375.60", "name": "Alston Mays", "gender": "male", "age": 33, "greeting": "Hello, Alston Mays! You have 10 unread messages.", "longitude": -67.445130000000006, "_id": "58046a78a50c13da27ab0d11" }, { "guid": "e328c11c-f948-42a6-aede-179ec44a7873", "index": 2, "favoriteFruit": "apple", "latitude": 17.807843999999999, "company": "INSOURCE", "email": "cassandramcintyre@insource.com", "picture": "http://placehold.it/32x32", "tags": [ "et", "anim", "dolor", "magna", "quis", "occaecat", "dolor" ], "registered": "2015-09-11T03:36:24 -06:00", "eyeColor": "blue", "phone": " 1 (865) 558-2301", "address": "189 Cranberry Street, Riverton, Arkansas, 5369", "friends": [ { "id": 0, "name": "Whitley Howe" }, { "id": 1, "name": "Roseann Perez" }, { "id": 2, "name": "Sasha Richard" } ], "isActive": false, "about": "Consequat adipisicing ut dolor in. Id enim consectetur qui incididunt non amet laboris. Veniam amet dolore proident est proident dolor sunt nulla est quis veniam commodo anim. Ut exercitation excepteur enim quis et ea veniam non laboris duis. Dolore cillum commodo dolore reprehenderit aliqua labore.rn", "balance": "$3,678.92", "name": "Cassandra Mcintyre", "gender": "female", "age": 29, "greeting": "Hello, Cassandra Mcintyre! You have 8 unread messages.", "longitude": 93.

Комментарии:

1. Вы пробовали просто выводить только длину ответа?

2. Что означает » IOException похоже, не вызвано»?

3. Ваши данные усекаются только журналом сообщений. Держу пари, что если вы зайдете в отладчик и проверите buffer , там будет вся ваша строка JSON.

4. @kris к сожалению, данные фактически не отключаются. Затем я передаю данные из listview, где я вижу только 1-2 элемента

5. моя ошибка, неправильная обработка результатов

Ответ №1:

Есть несколько моментов, которые вам нужно реализовать в вашем коде.

  1. URLConnection.connect(); не важно, когда мы вызываем URLConnection.getInputStream(); затем он автоматически вызывает Url.

  2. Закройте каждый поток, который вы открываете.

Таким образом, код будет

 private class GetContent extends AsyncTask<Void, Void, String>{

HttpURLConnection urlConnection = null;
BufferedReader reader = null;
String resultJson = "";

@Override
protected String doInBackground(Void... params) {

    try{
        URL url = new URL("http://www.json-generator.com/api/json/get/bSFiRdwiSq?indent=2");

        urlConnection = (HttpURLConnection)url.openConnection();
        urlConnection.setRequestMethod("GET");

        InputStream inputStream = urlConnection.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
        StringBuilder builder = new StringBuilder();
        int line;
        while ((line=reader.read()) > 0){
            builder.append((char)line);
        }
        reader.close();
        inputStream.close();
        String resultJson = builder.toString();

        Log.d("Result:", resultJson);

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

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

    return null;
}
}
  

Комментарии:

1. Теперь это было так, загрузка "name": "Cassandra Mcintyre",

2. Все верно, но ничего не меняет, что решило бы проблему. line это странное имя для переменной, которая не содержит строки.

Ответ №2:

Ваша логика чтения должна быть примерно такой:

 InputStream in = mConnection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in, enconding));    
int ch;
StringBuilder sb = new StringBuilder();         

while ((ch=reader.read()) > 0) {            
    sb.append((char)ch);
}

String resultjson= sb.toString().trim();
Log.d("Result:", resultJson);
  

Комментарии:

1. спасибо за подсказку, но это ничего не изменило. Все то же самое.

2. вместо чтения строки он читает символ за символом.

3. Теперь это было так, загрузка "name": "Cassandra Mcintyre",

4. Пожалуйста, объясните, почему вы считаете, что ваше предложение превосходит код OP.