2014-08-27 122 views
0

我想我需要重寫我的應用程序的一些模塊,因爲當呈現的實體數量增加,失敗和錯誤。此刻,我正在使用JacksonHttpClient。除了我信任傑克遜之外,有人告訴我這個問題是第二個問題。 HttpClient可以處理大量回復嗎? (FE this one,它是400行)處理巨大的JSON響應

除此之外,在我的應用我爲了解析請求要走的路是這樣的:

public Object handle(HttpResponse response, String rootName) { 
     try { 
      String json = EntityUtils.toString(response.getEntity()); 
      // better "new BasicResponseHandler().handleResponse(response)" ???? 
      int statusCode = response.getStatusLine().getStatusCode(); 
      if (statusCode >= 200 && statusCode < 300) { 
       return createObject(json, rootName); 
      } 
      else{ 
       return null; 
      } 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 

    } 

    public Object createObject (String json, String rootName) { 
     try { 
      this.root = this.mapper.readTree(json); 
      String className = Finder.findClassName(rootName); 
      Class clazz = this.getObjectClass(className); 
      return mapper.treeToValue(root.get(rootName), clazz); 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
    } 

如何提高這一塊的代碼大量回應會更有效率嗎?

提前致謝!

+1

什麼是您遇到的確切錯誤/異常?你看過[請求/響應實體流](http://hc.apache.org/httpclient-3.x/performance.html#Request_Response_entity_streaming)嗎? – kuporific 2014-08-27 15:24:21

+0

我不記得了,但是,我需要在Android中使用該流類嗎? :0 – tehAnswer 2014-08-27 18:26:16

回答

2

東西沒有必要創建String json,作爲ObjectMapper#readTree可以接受InputStream爲好。例如,這將會稍微高效:

public Object handle(HttpResponse response, String rootName) { 
    try { 
     int statusCode = response.getStatusLine().getStatusCode(); 
     if (statusCode >= 200 && statusCode < 300) { 
      return createObject(response.getEntity().getContent(), rootName); 
     } 
     else{ 
      return null; 
     } 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 

} 

public Object createObject (InputStream json, String rootName) { 
    try { 
     this.root = this.mapper.readTree(json); 
     String className = Finder.findClassName(rootName); 
     Class clazz = this.getObjectClass(className); 
     return mapper.treeToValue(root.get(rootName), clazz); 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 
} 
+0

我在嘗試之前就試過了,但它給了我更多的問題。 – tehAnswer 2014-08-27 15:19:29

0

我有1000+行json響應處理沒有問題,所以不應該是一個問題。至於更好的方法,谷歌GSON是驚人的,它將您的JSON映射到您的Java對象,無需任何特殊的解析代碼。

0

我想你可以讀取一個很好的舊的StringBuffer的數據。像

HttpEntity httpEntity = httpResponse.getEntity(); 
if (httpEntity != null) { 
    InputStream is = AndroidHttpClient.getUngzippedContent(httpEntity); 
    br = new BufferedReader(new InputStreamReader(is)); 
    StringBuilder sb = new StringBuilder(8192); 
    String s; 
    while ((s = br.readLine()) != null) sb.append(s); 
} 
+0

我不明白這會改變什麼。 – njzk2 2014-08-27 15:23:25