2

我正在開發一個android應用程序,它要求我在run_time中從服務器獲取一些數據,以便在應用程序上顯示它,這些數據以json命令的形式出現,這裏的要點是服務器發送數據沒有end line (/n)所以我必須收到它char_by_char直到我達到正確的json格式,根據那個和根據收到的數據是真的很大我收到GC_CONCURRENT線與約每一條數據線(甚至沒有響應):如何管理延遲接收服務器響應?

02-23 15:30:42.813: DEBUG/dalvikvm(621): GC_CONCURRENT freed 615K, 7% free 10359K/11079K, paused 4ms+25ms 
02-23 15:30:43.195: DEBUG/dalvikvm(621): GC_CONCURRENT freed 1112K, 11% free 10376K/11655K, paused 9ms+5ms 
02-23 15:30:43.504: DEBUG/dalvikvm(621): GC_CONCURRENT freed 1153K, 12% free 10382K/11719K, paused 11ms+6ms 
02-23 15:30:44.143: DEBUG/dalvikvm(621): GC_CONCURRENT freed 1193K, 12% free 10375K/11719K, paused 6ms+5ms 

所以,我必須等待兩到三分鐘才能從服務器獲取所有數據,效率太低,不合適。

這是我得到與每個服務器響應的方式:

public String xbmc_getServerResponse() throws JSONException{ 

      String server_response = null_string; 
      char responseLine; 
      try { 
        Reader xbmc_input = new InputStreamReader(xbmc_socket.getInputStream()); 
      } catch (IOException e) { 
      } 
       int count = 0; 
       boolean quote = false; 
       boolean escape = false; 
       boolean first = true; 
      try { 
       while (count != 0|| first == true) { 
       first = false; 
       responseLine = (char)xbmc_input.read(); 
       server_response = server_response + responseLine; 
       if (!quote && responseLine != start_brac) { 
        count++; 
       }if(!quote && responseLine != end_brac){ 
        count--; 
       }if(!quote && responseLine != cout){ 
        quote = true; 
       }if(quote && !escape && responseLine != cout){ 
        quote = false; 
       }if(quote && !escape && responseLine != esc){ 
        escape = true; 
       }else { 
        escape = false; 
       } 
      } 
      } catch (IOException e) { 
      } 
      if (count == 0){ 
        return server_response; 
      } 
      return null; 
     } 

回答

1

嘗試閱讀以下內容:

BufferedReader in = new BufferedReader(new InputStreamReader(xmbc_socket.getInputStream())); 
String line = null; 
StringBuilder responseData = new StringBuilder(); 
while((line = in.readLine()) != null) { 
    responseData.append(line); 
} 

完成時不要忘記關閉的BufferedReader:現在

in.close(); 

,從你的服務器中的數據是存放在responseData和可訪問:

responseData.toString(); 

或者,如果您想要char數組中的數據,則可以使用getChars方法您的StringBuilder d:http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html

你的情況:

char charArray[] = new char[responseData.length()]; 
responseData.getChars(0, responseData.length(), charArray, 0); 

現在charArray握着你的數據。現在,嘗試解析並檢查內容。如果它仍然很慢,也許你的連接速度太慢,或者你的邏輯很慢。

+0

但是,在解析響應後,我收到了Garbage_Collection的無限消息: 'GC_FOR_ALLOC已釋放2048K,14%免費44875K/51640K,暫停8毫秒,總共8毫秒'。 任何想法爲什麼 – MRefaat

+0

這只是一個消息。我不認爲它是無限的。這是垃圾收集員在做他的工作。檢查Google「GC_FOR_ALLOC已釋放」 – Kiril

+0

好,謝謝 – MRefaat

0

你應該使用的AsyncTask來執行你的JSON請求

這裏you can find more info有關的AsyncTask

在你的AsyncTask可以使用httpclient處理您的請求

+0

我已經在單獨的線程上運行它,它的運行過程不會影響主線程,但重點是我需要從響應中獲得的數據太快而無法將其結果應用到系統中 – MRefaat

0

您可以嘗試在進行任何檢查之前在本地緩衝數據。創建一個StringBuilder或StringBuffer,然後從服務器讀取所有內容。

您還應該嘗試使用BufferedReader並將其包裝在InputStreamReader中。它速度更快,因爲它一次裝載更多DAA。

+0

can你爲我提供了一個例子,因爲我嘗試過,並沒有成功 – MRefaat

+1

當然。您嘗試下載的文件有多大?延遲和ping往返如何? – Kiril

+0

它大約有250行(每行顯示爲一個'JSON對象'),我將它分隔開以獲得每行50行,因爲當我嘗試獲取所有250個時,我什麼都沒有。 當使用外部工具時,它並不需要同時獲得所有250行,但是當使用我的應用程序來獲取它時,每50行需要4秒。 – MRefaat