【问题标题】:Persistent connection for repeated API calls重复 API 调用的持久连接
【发布时间】:2013-04-03 11:05:36
【问题描述】:

我的 android 应用程序正在调用经过身份验证的 Web 服务 API,以根据数据类型从服务器下载和同步记录。

例如:

应用程序为不同的内容类型(Commerce, Science, Arts)循环调用API。

现在,对于每种内容类型,应用程序都会维护last sync date,以便它可以仅在该日期之后同步过去一个月的数据。

API 调用如下所示:

private void loadData(){
    String apiUrl = "";
    String[] classArray = { "Commerce", "Science", "Arts" };
    try{
        for(int classIndex = 0; classIndex < classArray.length; classIndex++){
            apiUrl = "http://www.myserver.com/datatype?class="+classArray[classIndex]+"&syncDate="+lastSyncDate;

            String responseStr = getSyncData(apiUrl);

            // Code to parse the JSON data and store it in SqliteDB.
        }

    }catch (Exception e) {
        e.printStackTrace();
    }

}

private String getSyncData(String webservice){
    String line = "", jsonString = "";

    try{
        URL url = new URL(webservice);  

        HttpURLConnection conn = (HttpURLConnection) url.openConnection(Proxy.NO_PROXY); //using proxy may increase latency
        conn.setInstanceFollowRedirects(false);

        String userName = "abc@myserver.com", password = "abc123";
        String base64EncodedCredentials = Base64.encodeToString((userName
                + ":" + password).getBytes(), Base64.URL_SAFE
                | Base64.NO_WRAP);
        conn.setRequestProperty("Authorization", "basic "+ base64EncodedCredentials);

        BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));

        while ((line = rd.readLine()) != null) {
            // Process line...

            return line;

        }

            rd.close();

        }

    }catch (Exception e) {
        e.printStackTrace();
    }
    return jsonString;

}

这个方法getSyncData()返回JSON响应,解析后存储在SqliteDb中。

此代码运行良好。但当classArray 中的内容类型较多且每个类都有较大的数据集时,会出现轻微的性能问题。

我的问题是:

为了提高这个过程的整体性能,我可以打开连接吗 到 www.myserver.com 并在循环中通过 API 调用传递参数以停止为每种内容类型一次又一次地创建连接。

这里我使用HttpURLConnection 进行API 调用,但可以在java 中使用任何其他技术。

主要目的是使连接持久化,以便应用程序不应该为每次调用一次又一次地创建它,因为每次调用应用程序都会创建一个单独的连接,这会消耗更多时间。

【问题讨论】:

  • http 不是持久协议
  • @njzk2 - 我没有卡在 http 上,可以使用 java 中的任何最佳技术来提高性能。
  • 有系统(我不记得具体是哪个)在多部分请求中一次发送多个请求

标签: java android performance httpurlconnection persistent-connection


【解决方案1】:

我之前用webcall -&gt; parse JSON -&gt; store DB -&gt; show/update views做过类似的处理

经过大量测试和调试后,我发现实际上拖慢进程的是 store DB 部分,与 webcall 或 JSON 解析无关。

我通过将其更改为:

webcall -&gt; parse JSON -&gt; fire new thread to store DB -&gt; show/update views

通过这个简单的更改,我的结果在 1 秒内开始出现(而不是之前的 5 到 6 秒)。

希望对你有帮助。

编辑:

关于连接本身,您可以使用网络套接字(它是持久的,但在 Android 中实现得不是很好,您必须进行大量手动解析),所以我建议先测试 DB 的东西。

【讨论】:

  • 感谢您的快速回复。是的,当然 DB 也是一个问题。也在优化数据库操作,但我仍然需要持久连接才能获得最高性能。
  • 我理解您的担忧,但根据我的经验,尝试在新线程中简单地触发数据库操作并检查性能差异,这非常大!
  • 是的,会尝试的。谢谢。
  • 我无法触发单独的数据库线程,因为在每次插入数据库后,应用程序都会维护该类的总行数,以便在下一次 API 调用中它可以跳过下载的数据并显示API 调用后在 db 中插入的行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-12
  • 2013-08-03
  • 1970-01-01
  • 2011-05-09
  • 2013-04-10
  • 1970-01-01
  • 2011-03-29
相关资源
最近更新 更多