Быстрое восстановление миниатюр в Android - PullRequest
1 голос
/ 16 декабря 2011

Я создал фотогалерею, которая позволяет выбирать несколько фотографий, но я заметил, что заполнение GridView миниатюрами может быть очень медленным. Я использую таймер:

timer = new Timer();
timer.schedule(new TimerTask() {        
    @Override
    public void run() {
        fetchNextThumb();
    }
}, 0, 25);

Он ищет в GridView детей без миниатюр (которые я отключаю), извлекает соответствующий большой палец из MediaStore, если он еще не кэширован, и выполняет setImageBitmap () в потоке пользовательского интерфейса:

private void fetchNextThumb()
{
    for (int i = 0; i < gridView.getChildCount(); i++)
    {
        ImageSelectView isv = (ImageSelectView)gridView.getChildAt(i);
        if (isv == null)
            continue;
        if (isv.isEnabled())
            continue;
        activeThumb = thumbCache.get(isv.getId());
        if (activeThumb == null)
        {
            activeThumb = MediaStore.Images.Thumbnails.getThumbnail(getContentResolver(), isv.getId(), MediaStore.Images.Thumbnails.MICRO_KIND, null);
            thumbCache.put(isv.getId(), activeThumb);
        }
        activeView = isv;
        runOnUiThread(setNextThumb);
        return;
    }
}
private Bitmap activeThumb;
private ImageSelectView activeView;
private Runnable setNextThumb = new Runnable() {
    public void run() {
        activeView.setImageBitmap(activeThumb);
        activeView.invalidate();
        activeView.setEnabled(true);
    }
};

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

1 Ответ

1 голос
/ 19 декабря 2011

Ну, я понял, почему некоторые миниатюры загружаются быстрее, чем другие. Я использую

managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{ MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID }, null, null, MediaStore.Images.Media._ID);

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

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

...