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

标签 android rest android-asynctask android-volley retrofit

我正在从 Android 设备调用 rest api,并且看到与 PC 相比的速度差异,我感到非常惊讶。 下面是来自 PC 上的休息工具的图像。 enter image description here

我尝试了几个库,如 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 程序的响应时间。

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

仅供引用:我在使用 Wifi 并为我的 PC 和 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();
        }

最佳答案

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

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

由于您的情况的差异不太合理,我最好的猜测是 GZIP 已禁用。您可以使用 RestAdapter.setLogLevel(LogLevel.FULL) 并检查 Accept-Encoding header 以查看是否启用了 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'

请注意,服务器端也必须支持压缩,我不确定您是否发布了响应 header 的完整输出,但它似乎缺少像 Content-Encoding 这样的东西: gzip,如果是这种情况,您也应该考虑在您的网络服务器上启用此功能。

关于android - 与 PC 相比,为什么 Android 中的响应时间(对于 Rest Call)较慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30378646/

相关文章:

安卓 OSM : How to replace default current location overlay icon

.net - ASP.NET Web API - 来自 ASP.NET MVC 4 应用程序的 POST/PUT/DELETE 请求

java - 如何从从 C# REST 服务检索到的 java 字符串中提取值

java - 致命自旋挂起/卡在 ThreadID 上

java - 当 AsyncTask 也使用另一个线程时如何设置延迟时间?

android - 下拉菜单背景在 Android 应用中变为黑色

Java 全局变量作用域

android - 错误 : SHARED_LIBRARIES missing STATIC_LIBRARIES Android.

json - 带 cURL 的 Bash 脚本;不以 JSON 形式发送 POST

android - 异步任务的空指针异常