与PC相比,为什么Android的响应时间(对于Rest Call)比较慢?

我正在从Android设备进行restAPI调用,真的很惊讶与PC相比速度的差异。 下面是来自PC上的rest工具的图像。 在这里输入图像说明

我尝试了像Retrofit,Volley这样的库,还有一些常规的Async任务,使得Android设备可以进行相同的其他调用,并注意到下面的响应时间。

(Response times with Retrofit library (Time includes converting json data to java objects)). Test 1: 8372 Ms Test 2: 7715 Ms Test 3: 7686 Ms Test 4: 10128 Ms Test 5: 7876 Ms (Response times with Volley. No conversion to Java Objects from Json Data ) Test 1: 6721 MS Test 2: 6610 MS Test 3: 6287 MS Test 4: 6118 MS Test 5: 6118 MS 

我在调用之前获取了System.currentTimeMillis() ,在得到响应之后,将这些值减去以获得Android程序中的响应时间。

如果有人能告诉我如何减less在android中的响应时间,这将是非常有帮助的。

仅供参考:我在Wifi上使用相同的networking为我的个人电脑和Android设备。

这里是改进的Android代码

 RestAdapter adapter = new RestAdapter.Builder() .setEndpoint(ENDPOINT) .build(); WeatherApi weatherApi = adapter.create(WeatherApi.class); startTime = System.currentTimeMillis(); weatherApi.getWeather(location.getLatitude(),location.getLongitude(),new Callback<WeatherInfo>() { @Override public void success(WeatherInfo arg0, Response arg1) { endTime = System.currentTimeMillis(); Log.d("TAG",endTime-startTime + ":Millisecs"); setWeatherInfo(arg0); if(weatherDialog != null && weatherDialog.isShowing()) weatherDialog.dismiss(); } 

Solutions Collecting From Web of "与PC相比,为什么Android的响应时间(对于Rest Call)比较慢?"

对其所使用的HTTP客户端进行改造是不可知的,所以它试图找出它可以用来执行请求的最好的HTTP客户端。

默认情况下Retrofit使用GSON作为转换器(也可以自定义)。 考虑到GSON使用reflection将JSON元素映射到您的类属性, WeatherInfo类的复杂性在转换步骤中可能会有性能损失。

由于你的情况的差异是不是很合理,我最好的猜测是GZIP被禁用。 您可以使用RestAdapter.setLogLevel(LogLevel.FULL)并检查Accept-Encoding标头以查看GZIP是否已启用。 如果情况并非如此,那么发布更相关的代码,以便我们可以提供更多的见解。

一个快速的方法,我相信你会注意到一个巨大的差异是,如果你包括okhttp和okhttp-urlconnection – 当这些类path中可用改造将默认使用okhttp作为客户端,它支持GZIP,无需任何进一步的configuration。

您可以通过将以下依赖项添加到您的build.gradle文件中:

 compile 'com.squareup.okhttp:okhttp:2.4.0' compile 'com.squareup.okhttp:okhttp-urlconnection:2.4.0' 

请注意,压缩也必须在服务器端支持,我不知道你是否已经发布了响应头的完整输出,但它似乎缺less像Content-Encoding: gzip ,如果是在这种情况下,您应该考虑在您的Web服务器上启用此function。

我的猜测是你的android系统是重载或在debugging器下或达尔维克VM编译有效。

只是在6秒钟的时间内,可以理解的是,存在一些物理限制,例如CPU负载或SDHC存储器访问。

另外如果你使用模拟器进行debugging,这也许是原因。