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;
        }
4

3 回答 3

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 保存您的数据。现在,尝试解析和检查内容。如果它仍然很慢,可能是您的连接速度太慢,或者您的逻辑很慢。

于 2014-03-04T08:22:56.123 回答
0

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

在这里您可以找到有关 asynctask 的更多信息

在那个异步任务中,您可以使用 httpclient 管理您的请求

于 2014-02-23T15:00:12.293 回答
0

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

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

于 2014-02-26T08:53:42.673 回答