Android 为什么HttpURLConnection.getInputStream()具有间歇性延迟?

Android 为什么HttpURLConnection.getInputStream()具有间歇性延迟?,android,performance,delay,httpurlconnection,Android,Performance,Delay,Httpurlconnection,我看到getInputStream返回时出现间歇性延迟,并且在 输入流 我使用异步HttpURLConnection在服务器上执行GET。服务器返回一个XML 一串我正在使用Fiddler监视服务器事务,并将事务发送回服务器 服务器的一致性(相对于Android应用程序的执行)约为250-600毫秒 但在安卓设备上,可以扩展到10+s。我试过在看台上表演 单独的设备,在同一个无线网络上,但我看到相同的长间歇延迟。有时 我得到一个套接字超时异常 我的应用程序正在海信安卓平板电脑上运行。我在指挥机器

我看到getInputStream返回时出现间歇性延迟,并且在 输入流

我使用异步HttpURLConnection在服务器上执行GET。服务器返回一个XML 一串我正在使用Fiddler监视服务器事务,并将事务发送回服务器 服务器的一致性(相对于Android应用程序的执行)约为250-600毫秒 但在安卓设备上,可以扩展到10+s。我试过在看台上表演 单独的设备,在同一个无线网络上,但我看到相同的长间歇延迟。有时 我得到一个套接字超时异常

我的应用程序正在海信安卓平板电脑上运行。我在指挥机器人 通过笔记本上的Fiddler代理的流量。我正在使用调试模式 通过USB从代码中捕获一些计时数据。计时器_值由我的活动在 它启动了异步任务。从异步任务开始,日志时间以毫秒为单位累积

我可以看出这不是来自Fiddler的DNS问题。我已尝试先关闭连接 在开始一个新的工作之前。我试过关掉“保持活力”。我已经看到了潜在的影响 cookie同步的。。。有什么想法吗

09-16 16:27:55.217: V/kinn_nat5(14093): top of background = 1
09-16 16:27:55.217: V/kinn_nat5(14093): time to connect = 9
09-16 16:28:13.247: V/kinn_nat5(14093): time to response = 18040
09-16 16:28:14.037: V/kinn_nat5(14093): time to read = 18825
09-16 16:28:14.087: D/dalvikvm(14093): GC_FOR_ALLOC freed 266K, 11% free 6716K/7495K, paused 52ms, total 52ms
09-16 16:28:14.097: V/kinn_nat5(14093): time to complete = 18889
09-16 16:28:14.187: D/dalvikvm(14093): GC_CONCURRENT freed 375K, 10% free 6801K/7495K, paused 1ms+2ms, total 15ms
以下是asynchTask中的代码:

@Override
protected String doInBackground(String... urls) {

    Log.v(LOG_TAG,"top of background = " + Long.valueOf(System.currentTimeMillis() 
        - ((MyApplication)activity.getApplicationContext()).timer_value) ); 

    URL url;
    InputStream is = null;
    HttpURLConnection connection = null;

    try {
        char[] buffer = new char[2000]; 
        int count=0;
        url = new URL(urls[0]);

        connection = (HttpURLConnection)url.openConnection();
        connection.setDoInput(true);
        connection.setReadTimeout(10000);
        connection.setConnectTimeout(15000);
        connection.setRequestMethod("GET");

        Log.v(LOG_TAG,"in front of connect = " +    Long.valueOf(System.currentTimeMillis() 
            - ((MyApplication)activity.getApplicationContext()).timer_value) ); 

        connection.connect();

        Log.v(LOG_TAG,"time to connect = " + Long.valueOf(System.currentTimeMillis() 
            - ((MyApplication)activity.getApplicationContext()).timer_value) ); 

        is = connection.getInputStream();

        Log.v(LOG_TAG,"time to response = " + Long.valueOf(System.currentTimeMillis() 
            - ((MyApplication)activity.getApplicationContext()).timer_value) ); 

        StringBuilder response = new StringBuilder();

        Reader reader = new InputStreamReader(is, "UTF-8");        

        while ((count = reader.read(buffer,0,1500)) > 0) {      

            response = response.append(new String(buffer, 0, count));
             Log.v(LOG_TAG,"time so far in read loop = " + Long.valueOf(System.currentTimeMillis() 
                - ((MyApplication)activity.getApplicationContext()).timer_value) );                        

        }
        is.close();
        reader.close();

        Log.v(LOG_TAG,"time to read = " + Long.valueOf(System.currentTimeMillis()
            - ((MyApplication)activity.getApplicationContext()).timer_value) );                        

        return response.toString();

        } 
        catch (Exception e) {   
            Log.v(LOG_TAG,"exception = " + e.toString());
            e.printStackTrace();
            return null;
        } 
    }        
这是一个比大多数人都快的LogCat。Fiddler显示事务需要24毫秒。我已计时 441毫秒时的完整代码:

09-16 16:21:44.287: V/kinn_nat5(13131): time to connect = 9
09-16 16:21:44.567: V/kinn_nat5(13131): time to response = 295
09-16 16:21:44.707: V/kinn_nat5(13131): time to read = 434
09-16 16:21:44.717: V/kinn_nat5(13131): time to complete = 441
09-16 16:21:44.757: D/dalvikvm(13131): GC_FOR_ALLOC freed 350K, 11% free 6673K/7495K,    paused 21ms, total 21ms
09-16 16:21:44.847: D/dalvikvm(13131): GC_CONCURRENT freed 281K, 10% free 6813K/7495K, paused 2ms+11ms, total 25ms
当情况不好时,它可能会为事务生成超时或类似的可怕延迟 哪个小提琴手的计时是47毫秒。我这里的计时是18秒!有什么想法吗

09-16 16:27:55.217: V/kinn_nat5(14093): top of background = 1
09-16 16:27:55.217: V/kinn_nat5(14093): time to connect = 9
09-16 16:28:13.247: V/kinn_nat5(14093): time to response = 18040
09-16 16:28:14.037: V/kinn_nat5(14093): time to read = 18825
09-16 16:28:14.087: D/dalvikvm(14093): GC_FOR_ALLOC freed 266K, 11% free 6716K/7495K, paused 52ms, total 52ms
09-16 16:28:14.097: V/kinn_nat5(14093): time to complete = 18889
09-16 16:28:14.187: D/dalvikvm(14093): GC_CONCURRENT freed 375K, 10% free 6801K/7495K, paused 1ms+2ms, total 15ms

在更换平板电脑尝试调试这个问题后,我现在怀疑根本原因是我一直使用的海信平板电脑的性能或特定的安卓版本

当我在调试模式下使用运行安卓4.4.4的华硕Nexus 7时,内存量相同,但CPU明显更强大,操作系统版本更新,系统的性能就像冠军一样。我没有看到任何暂停,而且表演非常接近我从Fiddler那里看到的。无论“保持活动”是否打开,系统都运行良好

我不知道为什么海信的表现如此糟糕。我没有时间去理解。这台机器运行的是4.1.1版本,运行起来和开箱即用的差不多,所以我不知道。我

下面是一个典型的交易,Fiddler的计时时间为440毫秒。我的计时显示完成时间为509毫秒

09-17 12:44:42.880: V/kinn_nat5(10361): top of background = 0
09-17 12:44:42.880: V/kinn_nat5(10361): in front of connect = 1
09-17 12:44:42.880: V/kinn_nat5(10361): time to connect = 4
09-17 12:44:43.381: V/kinn_nat5(10361): time to response = 498
09-17 12:44:43.391: V/kinn_nat5(10361): time to read = 508
09-17 12:44:43.391: V/kinn_nat5(10361): time to complete = 509
09-17 12:44:43.521: D/dalvikvm(10361): GC_FOR_ALLOC freed 800K, 8% free 10280K/11116K,    paused 17ms, total 17ms

我不熟悉Fiddler,但我假设您在不通过此代理路由时会得到类似的结果?有没有可能是你的服务器造成的?没错。如果我单独操作平板电脑,我会观察到延迟。Fiddler,让我们来调试进出平台的流量。通过查看http请求和对服务器的响应的时间摘要,我可以看出服务器是正常的。使用浏览器进行桌面访问没有性能问题。今晚,我想这一定是因为事务仍在等待完成,然后等待它们再次可用以供重用……如果在开发者选项中将后台进程设置为0,海信平板电脑的Http性能将大大提高。