2011-10-20 84 views
2

實際上我需要更多關於如何在Android SDK中讀取HttpUrlConnection類的響應的信息。我試圖從Web服務器讀取響應,但是當它太大時,我的應用程序將丟棄OutOfMemoryException。因此,歡迎任何有關如何將整個響應分解成碎片的任何資料/幫助/建議。Android HttpUrlConnection如何將響應分解爲片段

當我做了一個研究,我發現我應該設置這樣的:((HttpURLConnection) connection).setChunkedStreamingMode(1024);但我的問題是,我不知道如何閱讀這chuncked流。所以如果有人能以正確的方式引導我,我會非常高興。

謝謝!

示例代碼:

TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); 
      String deviceId = tm.getDeviceId(); 
      Log.w("device_identificator","device_identificator : "+deviceId); 
      String resolution = Integer.toString(getWindow().getWindowManager().getDefaultDisplay().getWidth())+ "x" + 
             Integer.toString(getWindow().getWindowManager().getDefaultDisplay().getHeight()); 
      Log.w("device_resolution","device_resolution : "+resolution); 
      String version = "Android " + Build.VERSION.RELEASE; 
      Log.w("device_os_type","device_os_type : "+version); 
      Log.w("device_identification_string","device_identification_string : "+version); 
      String locale = getResources().getConfiguration().locale.toString(); 
      Log.w("set_locale","set_locale : "+locale); 
      String clientApiVersion = null; 

      PackageManager pm = this.getPackageManager(); 
      PackageInfo packageInfo; 

      packageInfo = pm.getPackageInfo(this.getPackageName(), 0); 

      clientApiVersion = packageInfo.versionName; 
      Log.w("client_api_ver","client_api_ver : "+clientApiVersion); 

      long timestamp = System.currentTimeMillis()/1000; 
      String timeStamp = Long.toString(timestamp); 


      String url = "http://www.rpc.shutdown.com"; 
      String charset = "UTF-8"; 
      String usernameHash = hashUser(username,password); 
      String passwordHash = hashPass(username,password); 


      String query = String.format("username_hash=%s&password_hash=%s&new_auth_data=%s&debug_data=%s&client_api_ver=%s&set_locale=%s&timestamp=%s&"+ 
        "device_os_type=%s&mobile_imei=%s&device_sync_type=%s&device_identification_string=%s&device_identificator=%s&device_resolution=%s", 
        URLEncoder.encode(usernameHash, charset), 
        URLEncoder.encode(passwordHash, charset), 
        URLEncoder.encode("1", charset), 
        URLEncoder.encode("1", charset), 
        URLEncoder.encode(clientApiVersion, charset), 
        URLEncoder.encode(locale, charset), 
        URLEncoder.encode(timeStamp, charset), 
        URLEncoder.encode(version, charset), 
        URLEncoder.encode(deviceId, charset), 
        URLEncoder.encode("14", charset), 
        URLEncoder.encode(version, charset), 
        URLEncoder.encode(deviceId, charset), 
        URLEncoder.encode(resolution, charset)); 

      HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); 
      connection.setDoOutput(true); // Triggers POST. 
      connection.setRequestMethod("POST"); 
      connection.setRequestProperty("Connection", "Keep-Alive"); 
      connection.setRequestProperty("Charset", charset); 
      connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + charset); 
      OutputStream output = null; 
      try { 
       output = connection.getOutputStream(); 
       output.write(query.getBytes(charset)); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } finally { 
       if (output != null) try { output.close(); } catch (IOException logOrIgnore) {} 
      } 

      int status = ((HttpURLConnection) connection).getResponseCode(); 
      Log.i("","Status : "+status); 

      for (Entry<String, List<String>> header : connection.getHeaderFields().entrySet()) { 
       Log.i("Headers","Headers : "+header.getKey() + "=" + header.getValue()); 
      } 

      InputStream response = connection.getInputStream(); 
      Log.i("","Response : "+response.toString()); 
      int bytesRead = -1; 
      byte[] buffer = new byte[8*1024]; 
      while ((bytesRead = response.read(buffer)) >= 0) { 
       String line = new String(buffer, "UTF-8"); 
       Log.i("","line : "+line); 
       handleDataFromSync(buffer); 
      } 
+0

你能張貼一些示例代碼。它可以更容易地解釋在特定情況下要做什麼。 – kaspermoerch

+0

我剛剛添加了用於發送參數並連接到服務器並實際顯示響應主體的代碼。 –

回答

3

只需分配,可容納的數據量小,並從輸入流中讀取到該緩衝液中(使用read方法)字節的緩衝區。喜歡的東西:

InputStream is = connection.getInputStream(); 

int bytesRead = -1; 
byte[] buffer = new byte[1024]; 
while ((bytesRead = is.read(buffer)) >= 0) { 
    // process the buffer, "bytesRead" have been read, no more, no less 
} 
+0

該代碼在該行中引發了一個'FileNotFoundException':'InputStream response = connection.getInputStream();'。任何想法爲什麼? –

+0

也許您提供的網址不正確(在瀏覽器中嘗試)。此外,您粘貼的代碼不會從URL中讀取,而是寫入它(將數據發送到服務器並且不會收到任何內容)。我的代碼讀取服務器的響應。 –

+0

是的,實際上我必須發佈一些數據,然後根據我發送的數據從服務器讀取響應。 –

2

要讀取響應頭嘗試使用:

String sHeaderValue = connection.getHeaderField("Your_Header_Key");