如何管理延迟接收服务器响应?

时间:2014-02-23 13:42:04

标签: android json garbage-collection streamreader inputstreamreader

我正在开发一个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;
        }

3 个答案:

答案 0 :(得分: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数组中的数据,可以使用StringBuilder的getChars方法: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保存您的数据。现在,尝试解析和检查内容。如果它仍然很慢,可能你的连接太慢,或者你的逻辑很慢。

答案 1 :(得分:0)

你应该使用asynctask来执行你的json请求

这里you can find more info 关于asynctask

在该asynctask中,您可以使用httpclient

管理您的请求

答案 2 :(得分:0)

在进行任何检查之前,您可以尝试在本地缓冲数据。创建一个StringBuilder或StringBuffer,然后从服务器读取所有内容。

您还应该尝试使用BufferedReader,并将其包装在InputStreamReader周围。它更快,因为它一次加载更多daa。