суббота, 18 февраля 2012 г.

Android Training-Улучшение производительности разметок-Создание плавной прокрутки ListViewа

Ключом к плавной прокрутке ListView является освобождение основного потока приложения (UI потока) от тяжелых вычислений. Убедитесь что работа с данными в постоянной памяти устройства, данными в сети или базе данных осуществляется в отдельном потоке. Для проверки состояния вашего приложения вы можете включить StrictMode.
Использование фонового потока.

Использование фонового потока("рабочего потока") снимает напряжение в главном потоке, предоставляя ему возможность сфокусироваться на отрисовке UI. В большинстве случаем, использование AsyncTask обеспечивает простой путь выполнения вашей работы вне основного потока. AsyncTask автоматически ставит в очередь все запросы execute() и затем выполняет их последовательно. Такое поведение является глобальным в целом процессе и означает что вам не стоит волноваться о создании собственного пула потоков.
В коде ниже AsyncTask используется для загрузки изображений в фоновом потоке и дальнейшем показе по завершению. Также он показывает счетчик прогресса на месте изображений пока они загружаются.
// использование AsyncTask для загрузки картинок в фоновом потоке
new AsyncTask<ViewHolder, Void, Bitmap>() {
    private ViewHolder v;

    @Override
    protected Bitmap doInBackground(ViewHolder... params) {
        v = params[0];
        return mFakeImageLoader.getImage();
    }

    @Override
    protected void onPostExecute(Bitmap result) {
        super.onPostExecute(result);
        if (v.position == position) {
         
            v.progress.setVisibility(View.GONE);
            v.icon.setVisibility(View.VISIBLE);
            v.icon.setImageBitmap(result);
        }
    }
}.execute(holder);

Начиная с Android 3.0 (API level 11), дополнительная опция в AsyncTask позволяет ему работать на нескольких ядрах процессора.Вместо вызова execute() вы можете указать executeOnExecutor() и множественные запросы могут выполняться одновременно в зависимости от количества доступных ядер.
Помещение обьектов вида в View Holder.
Ваш код может вызывать findViewById() последовательно во время прокрутки ListView, что может замедлить быстродействие. Даже когда Adapter возвращает inflated вид для очистки, вам может понадобиться просмотреть и обновить элементы. Другим способом является использования шаблона "view holder".
Объект ViewHolder хранит каждый компонент вида разметки, так что можно получить доступ ко всем ним без повторного просмотра. Для начала, создадим класс для хранения набора видов, например::
static class ViewHolder {
  TextView text;
  TextView timestamp;
  ImageView icon;
  ProgressBar progress;
  int position;
}
Теперь заполним ViewHolder и сохраним его внутри разметки.
ViewHolder holder = new ViewHolder();
holder.icon = (ImageView) convertView.findViewById(R.id.listitem_image);
holder.text = (TextView) convertView.findViewById(R.id.listitem_text);
holder.timestamp = (TextView) convertView.findViewById(R.id.listitem_timestamp);
holder.progress = (ProgressBar) convertView.findViewById(R.id.progress_spinner);
convertView.setTag(holder);
Теперь мы можем легко получить доступ к каждому виду без дополнительного просмотра, экономя ценные процессорные циклы.
Оригинальный материал доступен тут.


Комментариев нет:

Отправить комментарий