Как лениво загружать изображения в Android ListView?
Во многих случаях пользовательский интерфейс приложения блокируется при загрузке изображений из Интернета. Эту проблему можно решить, реализовав ленивую загрузку изображений в виде списка при отображении текста. Это стратегия определения ресурсов как неважных и загрузки их только при необходимости. Это способ сократить длину критического пути рендеринга, что приводит к сокращению времени загрузки страницы. Дополнительные концептуальные сведения об отложенной загрузке доступны в разделе Что такое отложенная загрузка.
Что мы собираемся построить в этой статье?
Существуют различные библиотеки для реализации ленивой загрузки в Android. Один из них использует универсальную библиотеку загрузчика изображений . Мы реализуем его в этой статье.
Поэтапная реализация
Шаг 1. Создайте новый проект в Android Studio.
Чтобы создать новый проект в Android Studio, обратитесь к разделу «Как создать/запустить новый проект в Android Studio».
Шаг 2: Добавление макета
Добавьте ListView или RecyclerView вместе с необходимыми изображениями для отображения. Ссылки на оба представления следующие:
- Просмотр списка Android на Java с примером
- RecyclerView в Android с примером
Шаг 3: Добавление разрешений и зависимостей
Добавьте следующую зависимость в файл build.gradle :
implementation ‘com.nostra13.universalimageloader:universal-image-loader:1.9.5’
И следующие разрешения в файле manifest.xml
<uses-permission android:name = “android.permission.INTERNET”/>
<uses-permission android:name = “android.permission.WRITE_EXTERNAL_STORAGE”/>
Шаг 4: Реализация кода Java
Ниже приведен код псевдо-Java, который можно использовать для развертывания отложенной загрузки в любом приложении Android:
Java
``` // Get singleton instance ImageLoader imageLoader = ImageLoader.getInstance(); ``` ``` // Load image, decode it to Bitmap and // display Bitmap in ImageView (or any other view // which implements ImageAware interface) imageLoader.displayImage(imageUri, imageView); ``` ``` // Load image, decode it to Bitmap and return Bitmap to callback imageLoader.loadImage(imageUri, new SimpleImageLoadingListener() { @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { // Do whatever you want with Bitmap } }); ``` ``` // Load image, decode it to Bitmap // and return Bitmap synchronously Bitmap bmp = imageLoader.loadImageSync(imageUri); ``` ``` // Load image, decode it to Bitmap and display // Bitmap in ImageView (or any other view // which implements ImageAware interface) imageLoader.displayImage(imageUri, imageView, options, new ImageLoadingListener() { @Override public void onLoadingStarted(String imageUri, View view) { ... } @Override public void onLoadingFailed(String imageUri, View view, FailReason failReason) { ... } @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { ... } @Override public void onLoadingCancelled(String imageUri, View view) { ... } }, new ImageLoadingProgressListener() { @Override public void onProgressUpdate(String imageUri, View view, int current, int total) { ... } }); ``` ``` // Load image, decode it to Bitmap and return Bitmap to callback // result Bitmap will be fit to this size ImageSize targetSize = new ImageSize( 80 , 50 ); imageLoader.loadImage(imageUri, targetSize, options, new SimpleImageLoadingListener() { @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { // Do whatever you want with Bitmap } }); ``` ``` // Load image, decode it to Bitmap and return Bitmap synchronously // result Bitmap will be fit to this size ImageSize targetSize = new ImageSize( 80 , 50 ); Bitmap bmp = imageLoader.loadImageSync(imageUri, targetSize, options); ``` |
Альтернативные библиотеки
[Fresco] https://github.com/facebook/fresco
[Glide] https://github.com/bumptech/glide
[Picasso] https://github.com/square/picasso
[Volley : ImageLoader] https://android.googlesource.com/platform/frameworks/volley/