2010-02-17 2 views
4

В одной деятельности, я делаю это:Любые советы о том, как ускорить это в Android?

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

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

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

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

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

ответ

1

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

+0

Как их кешировать? – TIMEX

+0

ну, вы могли бы просто записать их на SD-карту или что-то в этом роде. Проблема действительно зависит от того, как вы можете обнаружить, почему значок по какой-то причине нуждается в обновлении. – pgsandstrom

+0

Посмотрите @ memoization или функции, которые memoize. Простая стратегия кэширования, которая будет работать на вас. – boatcoder

5

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

+3

Услуга - это путь, вы все равно можете добавить кеширование к службе, если это имеет смысл. – vickirk

2

Threading и кеширование, вероятно, хорошие идеи. Если в вашем списке всего десять человек (10 раз в 2 Кбайта памяти, 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; 
} 
} 

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