重复API调用的持久连接

时间:2013-04-11 09:48:11

标签: java android performance httpurlconnection persistent-connection

我的Android应用程序正在调用经过身份验证的webservice 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中的任何其他技术。

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

1 个答案:

答案 0 :(得分:0)

我之前使用webcall -> parse JSON -> store DB -> show/update views

进行了类似的处理

通过大量的测试和调试,我发现实际上正在减慢流程的是store DB部分,与网络共享或JSON解析无关。

我通过将其更改为:

解决了这种情况

webcall -> parse JSON -> fire new thread to store DB -> show/update views

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

希望它有所帮助。

修改

关于连接本身,你可以使用网络套接字(这是持久的,但在Android中没有很好地实现,你将不得不做大量的手动解析),所以我建议首先测试数据库的东西。