2013-09-23 3 views
0

Im делает простой HTTP GET,андроида HttpGet неполный ответ BufferedReader

я вижу на моем результате неполного ответа, , что Я делаю не так?

здесь код:

class GetDocuments extends AsyncTask<URL, Void, Void> { 

    @Override 
    protected Void doInBackground(URL... urls) { 

     Log.d("mensa", "bajando"); 

      //place proper url 
      connect(urls); 

      return null; 
    } 

    public static void connect(URL[] urls) 
    { 

     HttpClient httpclient = new DefaultHttpClient(); 

     // Prepare a request object 
     HttpGet httpget = new HttpGet("http://tiks.document.dev.chocolatecoded.com.au/documents/api/get?type=tree"); 

     // Execute the request 
     HttpResponse response; 
     try { 

      response = httpclient.execute(httpget); 



      // Examine the response status 
      Log.d("mensa",response.getStatusLine().toString()); 

      // Get hold of the response entity 
      HttpEntity entity = response.getEntity(); 
      // If the response does not enclose an entity, there is no need 
      // to worry about connection release 

      if (entity != null) { 

       // A Simple JSON Response Read 
       InputStream instream = entity.getContent(); 
       String result= convertStreamToString(instream); 
       // now you have the string representation of the HTML request 

       Log.d("mensa", "estratagema :: "+result); 

       JSONObject jObject = new JSONObject(result); 

       Log.d("mensa", "resposta jObject::"+jObject); 

       Log.d("mensa", "alive 1"); 

       JSONArray contacts = null; 
       contacts = jObject.getJSONArray("success"); 

       Log.d("mensa", "resposta jObject::"+contacts); 

       Log.d("mensa", "alive"); 

       //instream.close(); 

      } 


     } catch (Exception e) {} 
    } 



     private static String convertStreamToString(InputStream is) { 
     /* 
     * To convert the InputStream to String we use the BufferedReader.readLine() 
     * method. We iterate until the BufferedReader return null which means 
     * there's no more data to read. Each line will appended to a StringBuilder 
     * and returned as String. 
     */ 
     BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
     StringBuilder sb = new StringBuilder(); 

     String line = null; 
     try { 
      while ((line = reader.readLine()) != null) { 
       sb.append(line + "\n"); 
       Log.d("mensa", "linea ::"+line); 

      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       is.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     return sb.toString(); 
    } 
} 

я называю его:

GetDocuments get = new GetDocuments(); 

     URL url = null; 
    try { 
     url = new URL("ftp://mirror.csclub.uwaterloo.ca/index.html"); 
    } catch (MalformedURLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 


    //URL url = new URL("http://www.google.es"); 

    get.execute(url); 

редактировать 1 Я имею в виду неполной, как ответ, который получает усеченного?

пожалуйста обратите внимание на рисунок ниже ответа, как строка получает усечен,

это из-за размера журнала ?, , но другая проблема в том, что это не разобрать?

enter image description here

спасибо!

+0

Можете ли вы уточнить свой ответ INCOMPLETE. Я пробовал отлаживать ваш код и исключается JSONException. 09-23 14: 04: 42.045: E/a (507): org.json.JSONException: значение true при успехе типа java.lang.Boolean не может быть преобразовано в JSONArray – edisonthk

+0

Я не получаю исключение, также см. проверьте усеченную строку для ответа, tnx – MaKo

+0

О, я получаю исключение, потому что я делаю некоторые изменения в вашем коде. На вашем методе подключения класса GetDocuments добавьте журнал в свое исключение, тогда вы увидите его – edisonthk

ответ

1

У меня был точно такой же вопрос, за последние несколько дней , Я обнаружил, что мой код работал через Wi-Fi, но не 3G. Другими словами, я уничтожил всех обычных кандидатов на нитки. Я также обнаружил, что когда я запускал код в отладчике и просто ждал (скажем) через 10 секунд после того, как client.execute (...) работал.

Я думаю, что

response = httpclient.execute(httpget); 

асинхронный вызов сам по себе и, когда это медленно возвращает частичный результат ... поэтому JSON десериализации идет не так.

Вместо этого я попробовал эту версию выполнить с обратного вызова ...

try { 
    BasicResponseHandler responseHandler = new BasicResponseHandler(); 
    String json = httpclient.execute(httpget, responseHandler);   
} finally { 
    httpclient.close(); 
} 

И вдруг все это работает. Если вы не хотите строку или хотите свой собственный код, посмотрите интерфейс ResponseHandler. Надеюсь, это поможет.

2

Я не знаю, если это будет решить вашу проблему, но вы можете избавиться от метода и просто использовать:

String responseString = EntityUtils.toString(response.getEntity()); 
1

Я подтвердил, что это ограничение размера строки java. Я проверил это, добавив строку «abcd» с помощью ressponse и напечатав строку ответа в logcat. Но результатом является усеченная реакция без добавления строки «abcd».

Это

try { 
BasicResponseHandler responseHandler = new BasicResponseHandler(); 
String json = httpclient.execute(httpget, responseHandler); 
json= json+"abcd"; 
Log.d("Json ResponseString", json); 
} finally { 
httpclient.close(); 
} 

Так что я положил arrayString собрать ответ. Чтобы сделать массив, я расщепляется Мой JSon ответ формат, используя «}»

код приведен ниже (это работа вокруг только)

BasicResponseHandler responseHandler = new BasicResponseHandler(); 
    String[] array=client.execute(request, responseHandler).split("}"); 

Затем вы можете разобрать каждый объекты на объект JSON и json с вашими пользовательскими классами.

Если у вас есть какой-либо другой хороший метод для хранения ответа, PLS-доля, потому что я создаю пользовательский метод для каждого различных ответов json) ;.

Спасибо

Аршад

1

Я не могу»комментарий непосредственно из-за репутации, но в ответ на https://stackoverflow.com/a/23247290/4830567 я чувствовал, что я должен отметить, что предельный размер в Java String, составляет около 2 Гб (Integer. MAX_VALUE), поэтому здесь не было причин усечения.

В соответствии с https://groups.google.com/d/msg/android-developers/g4YkmrFST6A/z8K3vSdgwEkJ это логарифм, который имеет ограничение по размеру, поэтому добавление «abcd» и печать в logcat не работало. Сама строка имела бы прикрепленные символы. В ранее связанном обсуждении также отмечалось, что ограничение размера с самим протоколом HTTP иногда может быть фактором, но большинство серверов и клиентов обрабатывают это ограничение внутренне, чтобы не подвергать его пользователю.

Смежные вопросы