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