1

Приложение для Android запускает аутентифицированный веб-сервис API для загрузки и синхронизации записей с сервера на основе типа данных.Постоянное соединение для повторных вызовов 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 = "[email protected]", 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.

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

+0

http не является постоянным протоколом – njzk2

+0

@ njzk2 - Я не застрял на http, могу использовать любую лучшую технику в java для улучшения производительности. –

+0

есть система (я не помню, что именно), чтобы отправить несколько запросов сразу по многократному запросу – njzk2

ответ

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 секунд).

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

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

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

+0

Спасибо за быстрый ответ. Да, конечно, БД тоже вызывает беспокойство. Оптимизация операций с БД тоже, но все же мне нужно постоянное соединение для получения максимальной производительности. –

+0

Я понимаю вашу озабоченность, но по моему опыту попробуйте просто запустить операцию БД в новый поток и проверить разницу в производительности, это довольно большой! – Budius

+0

Да, попробуем это. Благодарю. –

Смежные вопросы