2014-09-27 4 views
0

Я пытаюсь прочитать данные JSON с URL-адреса, и я получаю очень странное поведение. У меня есть ExpandableListView, и у каждого элемента есть кнопка для восстановления онлайн-данных. При первом нажатии кнопки он работает отлично, но любая попытка последующего сбоя. В этих попытках метод readLine возвращает странные символы:BufferedReader readLine возвращает странные символы

Y o F W < 2e = P Hω/͹ mKr) nEr ݥ% ޙ!) R [ w < Le: O i & N 9! D T 171 < ej e W ք * 8 0 n R , /`(+ D % D ' "

Я не могу понять, почему он работает только в первый раз. Даже странный факт, что это происходит на физических устройствах, но не на эмуляторе. Мой код:

public static String readContents(String url) { 
     HttpURLConnection con = getConnection(url); 
     if (con==null) 
      return null; 
     try { 
      StringBuilder sb = new StringBuilder(8192); 
      String tmp; 
      BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF8")); 
      while((tmp = br.readLine()) != null) 
       sb.append(tmp).append("\n"); 
      br.close(); 
      return sb.toString(); 
     } catch(IOException e) { 
      Log.d("READ FAILED", e.toString()); 
      return null; 
     } 
    } 

ответ

0

я переписал свой код, используя EntityUtils Apache и теперь он работает:

static String response = null; 

    public static String readContents(String url) { 
     try { 
     // http client 
     DefaultHttpClient httpClient = new DefaultHttpClient(); 
     HttpEntity httpEntity = null; 
     HttpResponse httpResponse = null; 
     HttpGet httpGet = new HttpGet(url); 
     httpResponse = httpClient.execute(httpGet); 
     httpEntity = httpResponse.getEntity(); 
     response = EntityUtils.toString(httpEntity); 
     } catch (IOException e) { 
     Log.d("READ FAILED", e.toString()); 
     return null; 
     } 
     return response; 
    } 
2

Убедитесь, что вы звоните

con.disconnect(); 

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

Также немного

con.setRequestMethod("GET"); 
con.setRequestProperty("Accept-Charset", "UTF-8"); 

и

con.setRequestProperty("Accept", "application/json"); 

не помешает.

Вы также должны проверить значение conn.getResponseCode(), чтобы узнать, возвращает ли сервер ошибку. Все, что между 200 и 299 - код успеха.

+0

Спасибо, я добавил отключиться, но не повезло. И я получаю код 200. – droideparanoico

+0

@droideparanoico Я обновил ответ еще на пару вещей, которые вы, вероятно, должны делать. Вы думали о том, чтобы повторить возвращенную строку в logcat? Это поможет вам различать проблему с HTTP-поиском и проблему с отображением возвращаемой строки. –

+0

Те же отрицательные результаты. Это не проблема отображения, потому что возвращаемые данные обрабатываются JSONArray, и когда он возвращает эти странные символы, я получаю ошибку: "org.json.JSONException: Value WYo 8 + ¢ H eYq (Is типа java.lang.String не может быть преобразован в JSONArray " В любом случае, я только что повторил строку в logcat и подтвердил ее. – droideparanoico

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