Прокрутка через ListView с некоторыми изображениями очень запаздывает - PullRequest
6 голосов
/ 06 сентября 2010

У меня есть экран ниже, который содержит несколько изображений (6 на видимую страницу).Прокрутка вверх и вниз кажется мне довольно запоздалой.Это похоже на рендеринг изображений снова.Прокрутка назад кажется хуже, чем прокрутка вниз.

Кто-нибудь знает, как повысить производительность в такой области, чтобы создать плавную прокрутку?

Обновление : изображения и текствсе получено из моей базы данных SQLite.Список создается с использованием SimpleCursorAdapter.

Gallery

private class HistoryViewBinder implements SimpleCursorAdapter.ViewBinder 
{
    //private int wallpaperNumberIndex;
    private int timeIndex;
    private int categoryIndex;
    private int imageIndex;

    private java.text.DateFormat dateFormat;
    private java.text.DateFormat timeFormat;
    private Date d = new Date();

    public HistoryViewBinder(Context context, Cursor cursor) 
    {
        dateFormat = android.text.format.DateFormat.getDateFormat(context);
        timeFormat = android.text.format.DateFormat.getTimeFormat(context);

        //wallpaperNumberIndex = cursor.getColumnIndexOrThrow(HistoryDatabase.KEY_WALLPAPER_NUMBER);
        timeIndex = cursor.getColumnIndexOrThrow(HistoryDatabase.KEY_TIME);
        categoryIndex = cursor.getColumnIndexOrThrow(HistoryDatabase.KEY_CATEGORY);
        imageIndex = cursor.getColumnIndexOrThrow(HistoryDatabase.KEY_IMAGE);
    }

    @Override
    public boolean setViewValue(View view, Cursor cursor, int columnIndex) 
    {
        Log.d(TAG, "setViewValue");

        if (view instanceof TextView)
        {
            Log.d(TAG, "TextView");
            TextView tv = (TextView) view;

            if (columnIndex == timeIndex)
            {
                Log.d(TAG, "timeIndex");
                d.setTime(cursor.getLong(columnIndex));
                tv.setText(timeFormat.format(d) + "  " + dateFormat.format(d));
                return true;
            }
            else if (columnIndex == categoryIndex)
            {
                Log.d(TAG, "categoryIndex");
                tv.setText(cursor.getString(columnIndex));
                return true;
            }
        }
        else if (view instanceof ImageView)
        {
            Log.d(TAG, "ImageView");
            ImageView iv = (ImageView) view;

            if (columnIndex == imageIndex)
            {
                Log.d(TAG, "imageIndex");
                byte[] image = cursor.getBlob(columnIndex);
                Bitmap bitmapImage = BitmapFactory.decodeByteArray(image, 0, image.length);
                iv.setImageBitmap(bitmapImage);
                return true;
            }
        }

        return false;
    }
}

Ответы [ 3 ]

6 голосов
/ 07 сентября 2010

Проблема в том, что каждое изображение декодируется в момент, когда представление готово к показу. ListView перезапустит ваши представления, что означает, что в тот момент, когда представление покидает экран, оно будет использоваться повторно, и, следовательно, изображение будет перезаписываться и собирать мусор. Если элемент возвращается на экран, изображение должно быть снова декодировано из базы данных.

Декодирование достаточно быстрое, но если пользователь очень быстро меняет позицию в списке, все вызовы декодирования сделают ваш список очень запаздывающим.

Я бы добавил что-то вроде ImageCache. Класс, который содержит карту с WeakReferences к изображениям. Каждый раз, когда вы хотите отобразить изображение, вы смотрите, если изображение уже на карте и WeakReference все еще указывает на объект, если это не так, вам нужно декодировать изображение и затем сохранить его на карте.

Взгляните на ленивые вопросы о загрузке, они покажут вам, как поместить декодирование в фоновую задачу, а затем обновите список в момент загрузки изображений. Это немного больше усилий, но это может сделать список намного быстрее. Если вы собираетесь использовать пример кода из вопросов о отложенной загрузке, попробуйте использовать AsyncTasks вместо Threads для декодирования в.

1 голос
/ 07 августа 2014

Вот что вы должны прочитать, и это должно помочь вам решить проблему (часть «Отображение растровых изображений эффективно»): http://developer.android.com/training/displaying-bitmaps/process-bitmap.html

0 голосов
/ 06 сентября 2010

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

Кроме того, вы можете использовать Traceview , чтобы узнать, где вы проводите время.

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