1

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

例如:

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

现在,对于每种内容类型,应用程序都会进行维护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 中使用任何其他技术。

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

4

1 回答 1

0

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

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

我通过将其更改为:

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

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

希望能帮助到你。

编辑:

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

于 2013-04-11T10:02:57.280 回答