Постоянное соединение для повторных вызовов API

Мое приложение для Android вызывает 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.

Основная цель - сделать соединение постоянным, чтобы приложение не создавало его снова и снова для каждого вызова, потому что для каждого вызова приложение создает отдельное соединение, которое отнимает больше времени.

1 ответ

Я сделал подобную обработку раньше с 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 секунд).

Надеюсь, поможет.

редактировать:

Что касается самого соединения, вы можете использовать веб-сокеты (которые являются постоянными, но не очень хорошо реализованными в Android, вам придется выполнять довольно много ручного разбора), поэтому я предлагаю сначала протестировать БД.

Другие вопросы по тегам