【问题标题】:How to improve my Rest Calls on Android?如何改善我在 Android 上的休息通话?
【发布时间】:2011-04-20 11:20:08
【问题描述】:

我正在为 Android 制作应用程序。我喜欢尽快打完剩下的电话。当我以 XML 形式获得结果时,需要 5 秒(!)才能获得这样的简单 xml:

   <souvenirs>
     <souvenir>
       <id>1</id>
       <name>Example 1</name>
       <rating>3.4</rating>
       <photourl>/images/example.jpg</photourl>
       <price>3.50</price>
     </souvenir>
     <souvenir>
       <id>2</id>
       <name>Example 2</name>
       <rating>2.4</rating>
       <photourl>/images/example.jpg</photourl>
       <price>8.50</price>
       </souvenir>
   </souvenirs>

所以我尝试使用 JSON。但这也需要大约 5 秒钟的时间来检索。

我使用以下代码在 android 中加载 XML:

        URL url = new URL("http://example.nu?method=getAllSouvenirs");
            URLConnection conn = url.openConnection();
            long t=System.currentTimeMillis();

            InputStream ins = conn.getInputStream();
            Log.d("info", String.valueOf((System.currentTimeMillis()-t)));

日志说获取输入流大约需要 5000 毫秒。有什么方法可以加快速度吗?有人知道 Android Market 使用哪种技术吗?这比我的应用加载速度更快..

提前致谢! :)

【问题讨论】:

  • 你确定服务器不是问题,因为它太慢了?

标签: android xml json rest google-play


【解决方案1】:

当您尝试“手动”获取数据时 - 通过浏览器或其他方式(wget、curl)需要多长时间。

在 Android 上,您还应该考虑移动网络,它通常比台式计算机慢得多。延迟也更大。

对我来说,这听起来很像后端的问题(例如,尝试解析客户端的 IP 并因此花费大量时间)。

【讨论】:

    【解决方案2】:

    使用 Apache HttpClient 代替 URLConnection: Apache http client or URLConnection

    编辑(2012-02-07):在较新的 android 平台上不再适用,请阅读:http://android-developers.blogspot.com/2011/09/androids-http-clients.html

    【讨论】:

    • 无论你是使用 HttpClient 或 UrlConnection 还是信鸽,使用一个像样的遥控器都不应该花费 5 秒。
    • @Heiko Rupp true ...但 HttpClient 似乎比 UrlConnection 更快
    • 所以,我现在尝试了 HttpClient。结果:04-20 14:00:47.011:调试/信息(7126):json 调用持续时间:3312 04-20 14:01:26.621:调试/信息(7126):json 调用持续时间:3207 04-20 14:01 :27.631:调试/信息(7126):json调用持续时间:1009 04-20 14:01:42.521:调试/信息(7126):json调用持续时间:2103 04-20 14:01:43.861:调试/信息(7126 ): json 调用持续时间: 1333 04-20 14:02:00.651: DEBUG/info(7126): json 调用持续时间: 5148 04-20 14:02:01.841: DEBUG/info(7126): json 调用持续时间: 1190
    • @Martijn538 所以现在通话大约需要 2 秒。 ?
    • 当我打开我的活动并立即重新启动它(通过在菜单中来回按下大约 2 秒..但是当我等待半分钟时大约 3/4 秒..
    【解决方案3】:

    也许这就是它的实现方式,您无能为力。这是我的猜测。 我的意见是在您自己的线程(放入后台)和前台(主 UI 线程)中执行所有基于连接的工作来娱乐用户。 :)

    我已经玩了一点,它对我来说运行得足够快......这是我的代码:

    private static HttpResponse doPost(String url, JSONStringer json) {
        try {
            HttpPost request = new HttpPost(url);
            StringEntity entity;
            entity = new StringEntity(json.toString());
    
            entity.setContentType("application/json;charset=UTF-8");
            entity.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json;charset=UTF-8"));
            request.setEntity(entity);
    
            try {
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpResponse response = httpClient.execute(request);
                return response;
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }
    

    在其他地方我称这种方法为:

    HttpResponse httpResponse = doPost(url, json);
    BufferedReader reader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent(), "UTF-8"));
    

    它对我来说很好......

    【讨论】:

    • 谢谢,当我在我的电脑上执行 url 时,只需要大约 100 毫秒,所以这不是问题。我只是想知道如何让我的应用程序与 Android Market 一样快..
    • @Martijn 在您的手机浏览器上试试这个。
    • 我试过了,这比在我的应用程序中使用它要快。现在我正在尝试为我的 httpClient 实现 Keepalive。有人知道怎么做这个吗?听说在 App 中重用 HttpClient 可以提高速度。我通过在主活动中创建它来重用我的 HttpClient。然后,当启动另一个 Activity 时,我将它传递给我的 Intent (putExtra) 并使我的 HttpClient Parceable.. 这是正确的方法吗?
    • 根据我上面描述的过程,调用doPost方法需要307毫秒,BufferedReader reader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent(), "UTF-8"));需要2毫秒我在模拟器上试过这个。如果我将模拟器的速度和延迟设置为 GPRS 号码分别为 628 和 3 毫秒。
    • 我突然想到只有第一个电话需要很长时间。现在我实现了我自己的 restclient 和 ZMeda 的方法。我得到以下结果: 通话时长:2401 json 通话时长:416 通话时长:1485 json 通话时长:908 通话时长:1142 json 通话时长:864 通话时长:1229 json 通话时长:635 通话时长:1459 json 通话时长:第575章 有没有什么办法可以加快速度?如果你们想试试这个网址:91.121.69.135/~jpmwebd/android/?method=getAllSouvenirs
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多