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

时间:2015-05-21 15:51:32

标签: android rest android-asynctask android-volley retrofit

我正在通过Android设备进行休息api通话,并且与PC相比,看到速度的差异真的很惊讶。 以下是来自PC上的休息工具的图像。enter image description here

我尝试了很少的库,比如Retrofit,Volley以及常规的异步任务来从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程序中获得超过响应时间。

如果有人能告诉我如何减少android中的响应时间,那将非常有用。

仅供参考:我正在使用Wifi并在我的PC和Android设备上使用相同的网络。

这是Retrofit 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();
        }

2 个答案:

答案 0 :(得分:4)

Retrofit与它使用的HTTP客户端无关,因此它试图找出可用于执行请求的最佳可用HTTP客户端。

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

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

我确定你会注意到一个巨大差异的快速方法是,如果你包括okhttp和okhttp-urlconnection - 当它们在类路径中可用时,Retrofit将默认使用okhttp作为客户端,它支持GZIP而没有任何进一步配置。

您可以通过将以下依赖项添加到build.gradle文件来执行此操作:

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

请注意,服务器端也必须支持压缩,我不确定您是否已发布响应头的完整输出,但似乎缺少Content-Encoding: gzip之类的内容,如果是这种情况,您应该考虑在您的Web服务器上启用此功能。

答案 1 :(得分:1)

我的猜测是你的android系统过载或调试器或dalvik vm编译在那里生效。

在6秒钟之内就可以理解存在一些物理限制,例如CPU负载或SDHC内存访问。

此外,如果您使用模拟器进行调试,这可能是原因。