Любой совет, как ускорить это в Android? - PullRequest
4 голосов
/ 17 февраля 2010

В одном действии я делаю это:

  • Каждую минуту я обновляю местоположение GPS в облаке.
  • Затем, после обновления местоположения, я загружаюсписок из 10 человек и их иконки ... и обновите их в списке.(каждый значок имеет размер 80x80 и около 2 КБ)

Это выполняется каждую минуту, снова и снова.

Моя проблема: кажется, что это немного медленно?Иногда, когда я пролистываю список, это медленно?И когда я нажимаю, ответ не мгновенный ... и может потребовать небольшой задержки.

Как вы думаете, я могу исправить это с помощью нескольких «потоков» или что-то?Пожалуйста, порекомендуйте.Спасибо.

Редактировать: при загрузке имен и пользовательских значков в список ... это практически невозможно.Список замирает ... и вы не можете провести пальцем вверх или вниз. А когда он не загружается ... список пролистывает очень медленно.

Ответы [ 3 ]

5 голосов
/ 17 февраля 2010

Для таких действий, как загрузка материала «в» Деятельности, всегда полезно иметь фоновые службы для выполнения работы для Деятельности, которая затем остается отзывчивой! Если вы попытаетесь сделать что-то подобное в самой Деятельности, у вас определенно возникнут проблемы с отзывчивостью, я вас уверяю! Итак, мой ответ - да. Для этого создайте фоновый сервис!

2 голосов
/ 17 февраля 2010

Потоки и кэширование, вероятно, хорошие идеи. Если в вашем списке всего десять человек (10 кбайт памяти, 20 кбайт), рассмотрите возможность использования кэшированного списка для пользовательского интерфейса и обновляйте его после каждой загрузки. Для этого проверьте класс AsyncTask, который был представлен в Android 1.5. Простой пример кода может выглядеть примерно так:

mCachedList;

private void onUpdate(Location location) { 
  DownloadTask refresh = new DownloadTask(location);
  refresh.execute();
}

private class DownloadTask extends AsyncTask<Location, void, ArrayList<ListItem> {

protected ArrayList<ListItem> doInBackground(Location... params) {
  final ArrayList<ListItem> refreshlist = new ArrayList<ListItem>;
  Location location = params[0];
  sendToCloud(location);
  while(!done) {
    ListItem next = downLoadPerson();
    refreshlist.add(next);
  }
  return refreshlist;
}

protected void onPostExecute(ArrayList<ListItem> refreshlist) {
  mCachedList = refreshlist;
}
}

Используйте кэшированный список для пользовательского интерфейса, пока фоновая задача не завершится и не обновится. Есть более продвинутые вещи, которые вы могли бы сделать, чтобы сэкономить больше памяти, такие как повторное использование списка обновлений и т. Д., Но я надеюсь, что выше приведены некоторые сведения о том, как сделать это в фоновом режиме. Также не забывайте повторно использовать конвертируемое представление в вашем списке, чтобы избежать большого количества сбора мусора для каждого элемента при прокрутке списка.

1 голос
/ 17 февраля 2010

Если вам не удастся загрузить всю информацию в одном запросе, вы выиграете время, поточив ее. Кроме того, действительно ли необходимо загружать иконки снова и снова? Может быть, вы можете их кешировать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...