【问题标题】:How to manage delaying of receiving server responses?如何管理接收服务器响应的延迟?
【发布时间】:2014-02-23 13:42:03
【问题描述】:

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

【问题讨论】:

    标签: android json garbage-collection streamreader inputstreamreader


    【解决方案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 保存您的数据。现在,尝试解析和检查内容。如果还是很慢,可能是你的连接太慢了,或者你的逻辑很慢。

    【讨论】:

    • 但是在解析响应后我收到了无限的 Garbage_Collection 消息:GC_FOR_ALLOC freed 2048K, 14% free 44875K/51640K, paused 8ms, total 8ms。知道为什么
    • 这只是一条信息。我不认为它是无限的。那就是垃圾收集器在做他的工作。检查 Google 是否“GC_FOR_ALLOC 已释放”
    【解决方案2】:

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

    这里you can find more info 关于异步任务

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

    【讨论】:

    • 我已经在一个单独的线程上运行它并且它正在运行的进程不会影响主线程,但关键是我需要从响应中获得的数据太快来应用它的结果到系统
    【解决方案3】:

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

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

    【讨论】:

    • 你能给我一个例子吗,因为我尝试过但没有成功
    • 当然。您尝试下载的文件有多大?延迟和 ping 往返如何?
    • 大约 250 行(每一行都像一个 JSON Object),我将它分开以将每 50 行放在一起,因为当我试图获得所有 250 行时,我什么也没得到。当使用外部工具时,几乎不需要同时获取所有 250 行,但是当使用我的应用程序来获取它时,每 50 行需要 4 秒。
    猜你喜欢
    • 2018-05-19
    • 2011-09-26
    • 2023-04-03
    • 2013-01-02
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 2018-08-09
    相关资源
    最近更新 更多