Открыть изображения в ListView из БД

121
07 августа 2019, 10:50

В БД сохранены ссылки на исображения которые локально хранятся на устройстве. При открытии лист вью я использую кастомный адаптер который загружает изображения по ссылкам

 File filePath = new File(image); //image содержит ссылкуна изображение
                   Uri fileUri = Uri.fromFile(filePath);
                   final InputStream imageStream;
                   imageStream = context.getContentResolver().openInputStream(fileUri);
                   selectedImage = BitmapFactory.decodeStream(imageStream);
                   imageView.setImageBitmap(selectedImage);

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

 mt = new MyTask();
 mt.execute(image);
class MyTask extends AsyncTask<String, Void, Bitmap> {
 private    Bitmap selectedImage = null;

    @Override
    protected Bitmap doInBackground(String... params) {
        String[] image = params;

            try {
                File filePath = new File(image[0]);
                Uri fileUri = Uri.fromFile(filePath);
                final InputStream imageStream;
                imageStream = context.getContentResolver().openInputStream(fileUri);
                selectedImage = BitmapFactory.decodeStream(imageStream);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
       // }
        return selectedImage;
    }

    @Override
    protected void onPostExecute(Bitmap result) {
        super.onPostExecute(result);
        imageView.setImageBitmap(selectedImage);

    }
}

Предыдущая проблема решилась но появилась другая. Асин таск получает ссылки по одной штуке, по мере прокручивания, т.е. если на момент открытия лист вью в видимой области 3 изображения, загрузится только одно, остальные только по мере прокрутки. Как решить эту проблему, может есть более правильный сособ?

Answer 1

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

Таких библиотек много, я лично предпочитаю Universal Image Loader

Альтернатив достаточно много развелось в последнее время, из них наверное можно выделить Picasso - как одну из наиболее продвинутых.

READ ALSO
Как получить класс из переменной и создать новый объект этого класса

Как получить класс из переменной и создать новый объект этого класса

Имеется запись вида: List list; В абстрактном классеВ наследниках через конструктор, я его инициализирую

122
Как связать бэкэнд и фронтэнд через nginx

Как связать бэкэнд и фронтэнд через nginx

написал учебное приложение: бэк на java(Spring boot), а фронт на angularjsСейчас пытаюсь запустить приложение, томкэт запускается на порту 8080

121
Перестал работать android studio emulator - &ldquo;Устройство, подключенное к системе, не работает&rdquo;

Перестал работать android studio emulator - “Устройство, подключенное к системе, не работает”

Я запустил его в какой-то момент, и он был очень очень медленным, однако после того, как я закрыл его и открыл снова, он перестал работать с этой...

139