- Русские Блоги
- Платформа для эффективной асинхронной загрузки изображений Android
- Обзор
- подробно
- Загрузка кода: http://www.demodashi.com/demo/12143.html
- Как реализовать загрузку изображений в список в отдельном потоке на Android
- Задача:
- Реализация:
- Пример испольования:
- Описание реализации:
- Заключение:
- Android-асинхронная загрузка изображения и его отображение
- 3 ответа
- Похожие вопросы:
Русские Блоги
Платформа для эффективной асинхронной загрузки изображений Android
Обзор
подробно
Загрузка кода: http://www.demodashi.com/demo/12143.html
На данный момент существует множество сторонних платформ загрузки изображений, таких как UIL, Volley Imageloader и т. д. Но лучше всего знать принцип реализации, поэтому давайте рассмотрим проектирование и разработку загружаемого в сеть, локального кадра изображения.
Хорошо известно, что в кадре изображения обязательно нужен кеш. Здесь мы используем LruCache для управления кешем изображения, как и другие кадры. Конечно, лучше использовать LIFO для измерения загрузки изображения, потому что Загрузить последнюю версию пользователю.
Мы используем механизм асинхронной обработки сообщений для реализации задачи асинхронной загрузки изображения: он используется для потока пользовательского интерфейса для обновления ImageView после загрузки Bitmap.
Принцип загрузки сетевых изображений заключается в том, что если кэш жесткого диска включен, при загрузке сначала загружаются из памяти, затем загружаются с жесткого диска и, наконец, загружаются из сети. После завершения загрузки выполните запись на жесткий диск и в кэш памяти.
Если кэш жесткого диска не включен, просто загрузите его прямо из сети сжатия и, наконец, добавьте кеш памяти.
два. Визуализация презентации
три. Анализ реализации фреймворка загрузки изображений
1. Сжатие изображения
Во многих случаях сетевые или локальные изображения относительно велики, а размер нашего дисплея ImageView относительно невелик, поэтому нам нужно сжать изображение, чтобы отобразить его в ImageView.
1.1, локальное сжатие изображений
(1) Получите размер, отображаемый ImageView
В приведенном выше коде максимальная ширина не используется getMaxWidth (); она получается путем отражения. Это связано с тем, что для getMaxWidth требуется API 16. Это невозможно. Для проблем совместимости можно использовать только механизм отражения. , Так что я не согласен с размышлениями.
(2) Установите inSampleSize изображения.
Вычислить inSampleSize в соответствии с размером отображаемого ImageView и фактическим размером изображения. Реализация выглядит следующим образом:
1.2, сетевое сжатие
Выше показано сжатие локальных изображений. Если это сетевое изображение, возможны два случая. Если кэш жесткого диска включен, загрузите изображение на локальный компьютер, а затем используйте указанный выше метод локального сжатия;
Если кэш жесткого диска не включен, используйте BitmapFactory.decodeStream () для получения растрового изображения, а затем вычислите сжатие частоты дискретизации так же, как при локальном сжатии. следующим образом:
Сжатие изображений почти такое же, давайте посмотрим на дизайн и реализацию платформы загрузки изображений.
2. Архитектура дизайна фреймворка загрузки изображений.
После сжатия изображения поместите его в наш LruCache, а затем установите для него ImageView с помощью метода setImageBitmap.
Общая структура платформы загрузки изображений выглядит следующим образом:
(1) Реализация синглтона, синглтон не передает параметры по умолчанию, конечно, он также поддерживает структуру вызова одиночного элемента с параметром.
(2) Управление кешем изображений: содержит LruCache для управления нашими изображениями.
(3) Очередь задач: каждый раз, когда приходит новый запрос на загрузку изображений, он упаковывается как задача и добавляется в очередь задач TaskQueue;
(4) Поток фонового опроса: этот поток запускается, когда экземпляр инициализируется в первый раз, а затем он всегда будет выполняться в фоновом режиме; каждый раз, когда появляется запрос на загрузку изображения,
Помимо создания новой задачи в очереди задач, он также отправляет сообщение фоновому потоку, а фоновый поток использует пул потоков для перехода в TaskQueue для извлечения задачи для выполнения;
Базовая архитектура проектирования фреймворка приведена выше, давайте посмотрим на конкретную реализацию:
3. Конкретная реализация структуры загрузки изображений.
3.1. Метод реализации и построения синглтона:
3.2. Тема фонового опроса:
В фоновом потоке создайте обработчик для обработки сообщения отображения изображения, отправленного задачей загрузки изображения.
3.3. Используйте рамку для отображения изображения — загрузите изображение и отобразите его в ImageView.
При загрузке отображаемого изображения оцените, есть ли LruCache, если да, извлеките его из LruCache, чтобы загрузить отображение;
В противном случае создайте новую задачу загрузки изображения и добавьте ее в очередь задач.
3.4. Создайте задачу загрузки изображения и добавьте ее в очередь задач.
Задача загрузки изображения сначала определит, загружено ли оно из сети, если да, то определит, есть ли LruCache и DiskCache снова, если их нет, он будет загружен и загружен из сети;
Если он загружен не из сети, он будет загружен непосредственно с локального компьютера; наконец, независимо от того, загружен он из сети или нет, изображение должно быть записано в LruCache и DiskCache, а битовая карта будет обновлена.
Конечно, после того, как задача будет окончательно добавлена в очередь задач, фоновый поток будет уведомлен с помощью метода mPoolThreadHandler.sendEmptyMessage (24) для удаления одного из пула потоков задач.
поток задачи для выполнения.
3.4, отобразить растровое изображение в ImageView
Отправляйте сообщения через UIHandler для отображения Bitmap в ImageView.
Наконец, во фреймворке используются два семафора. Давайте проанализируем немного ниже:
Первый: mPoolThreadHandlerSemaphore = new Semaphore (0); Он используется для управления завершением инициализации нашего mPoolThreadHandler. Когда мы используем mPoolThreadHandler, он будет обнулен. Если он равен нулю, он передаст mPoolThreadHandler. () для блокировки; когда инициализация mPoolThreadHandler завершится, мы вызовем .release (); для разблокировки.
Второй: mPoolTThreadSemaphore = new Semaphore (threadCount); Количество этого семафора такое же, как количество потоков, которые мы загружаем изображение; каждый раз, когда мы берем задачу на выполнение, мы позволяем семафору Минус один; каждый раз, когда задача завершается, семафор будет увеличиваться на +1, а затем задача будет извлечена; какова цель? Почему, когда приходит наша задача, если в это время нет незанятого потока, задача всегда добавляется в TaskQueue. Когда поток завершает задачу, он может перейти в TaskQueue, чтобы получить задачу в соответствии со стратегией. Только в этом случае наш LIFO имеет смысл.
четыре. Примеры использования фреймворка
Здесь мы используем простой GridView для загрузки и отображения 1000 изображений, чтобы продемонстрировать использование нашей платформы.
4.1. Реализация файла макета:
4.2. Реализация примеров демонстрационных файлов:
Пятерки. Схема структуры каталогов кода проекта
Источник
Как реализовать загрузку изображений в список в отдельном потоке на Android
По просьбам трудящихся, статья о методе загрузки изображений в список в отдельном потоке на Android.
Задача:
Реализовать механизм загрузки изображений из Интернета и отображения их в списке. При этом загрузка изображений должна быть реализована в отдельном потоке, во избежания «зависания» UI приложения.
Реализация:
Для реализации поставленной задачи использованы стандартный виджет ListView и адаптер — ArrayAdapter. Для работы с изображениями создан helper-класс ImageManager, который имеет два метода downloadImage() и fetchImage(). Первый загружает изображений из Интернета. Второй — вызывает загрузку изображений в отдельном потоке и устанавливает результат в ImageView.
Пример испольования:
Реализацию поставленной задачи будем расматривать на примере моего проекта. И на его код я буду ссылаться в статье.
Исходники: fileshare.in.ua/3053597
APK: fileshare.in.ua/3053596
Описание реализации:
- package com.rudenko.android.ListIconFetching;
- import java.io.BufferedInputStream;
- import java.io.IOException;
- import java.net.HttpURLConnection;
- import java.net.MalformedURLException;
- import java.net.URL;
- import android.graphics. Bitmap ;
- import android.graphics.BitmapFactory;
- import android.os.Handler;
- import android.os.Message;
- import android.util.Log;
- import android.widget.ImageView;
- public class ImageManager <
- private final static String TAG = «ImageManager» ;
- /** Private constructor prevents instantiation from other classes */
- private ImageManager () <>
- public static void fetchImage(final String iUrl, final ImageView iView) <
- if ( iUrl == null || iView == null )
- return ;
- final Handler handler = new Handler() <
- @Override
- public void handleMessage(Message message) <
- final Bitmap image = ( Bitmap ) message.obj;
- iView.setImageBitmap(image);
- >
- >;
- final Thread thread = new Thread() <
- @Override
- public void run() <
- final Bitmap image = downloadImage(iUrl);
- if ( image != null ) <
- Log.v(TAG, «Got image by URL: » + iUrl);
- final Message message = handler.obtainMessage(1, image);
- handler.sendMessage(message);
- >
- >
- >;
- iView.setImageResource(R.drawable.icon);
- thread.setPriority(3);
- thread.start();
- >
- public static Bitmap downloadImage( String iUrl) <
- Bitmap bitmap = null ;
- HttpURLConnection conn = null ;
- BufferedInputStream buf_stream = null ;
- try <
- Log.v(TAG, «Starting loading image by URL: » + iUrl);
- conn = (HttpURLConnection) new URL(iUrl).openConnection();
- conn.setDoInput( true );
- conn.setRequestProperty( «Connection» , «Keep-Alive» );
- conn.connect();
- buf_stream = new BufferedInputStream(conn.getInputStream(), 8192);
- bitmap = BitmapFactory.decodeStream(buf_stream);
- buf_stream.close();
- conn.disconnect();
- buf_stream = null ;
- conn = null ;
- > catch (MalformedURLException ex) <
- Log.e(TAG, «Url parsing was failed: » + iUrl);
- > catch (IOException ex) <
- Log.d(TAG, iUrl + » does not exists» );
- > catch (OutOfMemoryError e) <
- Log.w(TAG, «Out of memory. » );
- return null ;
- > finally <
- if ( buf_stream != null )
- try < buf_stream.close(); >catch (IOException ex) <>
- if ( conn != null )
- conn.disconnect();
- >
- return bitmap;
- >
- >
* This source code was highlighted with Source Code Highlighter .
Метод fetchImage():
public static void fetchImage(final String iUrl, final ImageView iView);
Входные параметры:
iUrl — URL к изображению для загрузки
iView — ссылка на виджет ImageView, которому будет назначено изображение после загрузки.
Оба параметра являются обязательными.
Результат:
Функция не возвращает ничего.
Краткое описание:
Функция создает поток для загрузки изображения. На время загрузки во входной ImageView устанавливается стандартное изображение. После завершения загрузки, изображение входного ImageView обновляется загруженным.
Несколько слов о потоке: в строке 46 происходит понижение приоритета потока. Это сделано для того, что бы данный поток не забирал ресурсы необходимые для корректной работы приложения.
Метод downloadImage():
public static Bitmap downloadImage( String iUrl);
Входные параметры:
iUrl — URL к изображению для загрузки
Результат:
Изображение загруженное из интернета, либо Null — если операция не была выполнена успешно.
Краткое описание:
В функции создается соединение с сервером, где находится изображение. Происходит получение входного потока, который далее передается в BitmapFactory для создания изображения.
Как использовать ImageManager:
Рассмотрим на примере к статье. В методе FetchImageAdapter.getView(), для подгрузки изображений в ImageView строки списка, используется следующая строка:
ImageManager.fetchImage(android.image, holder.ib_logo);
где android.image — URL к изображению, а holder.ib_logo — ImageView строки списка.
Заключение:
Данный механизм подходит для загрузки изображения из Интернета в параллельном потоке, для любого виджета ImageView Android. Т. е. данный механизм можно использовать не только для конкретно поставленной задачи.
Источник
Android-асинхронная загрузка изображения и его отображение
Это код, изображение действительно загружено, но проблема в том, что я не могу его отобразить из-за того, что не могу разрешить метод findViewById
В своей основной деятельности я называю ImageDownloader внутри OnCreate вот так:
3 ответа
Я пытаюсь получить изображение с URL по JSON данные, которые успешно работают. Все, что ниже, работает SLOWLY. Тем не менее, я пытаюсь найти способ заставить URL отображаться намного быстрее ниже в Android Volley или другом быстром методе. Я пытаюсь загрузить эти изображения из URL (тоже.
Я создаю приложение, которое принимает изображение android (захваченное камерой устройства), загружая его на сервер (сервлет). На сервере мне нужно работать с ним как с BufferdImage (или любым другим классом java). моя проблема заключается в том, что изображение в android представлено как объект.
Чтобы получить доступ к findViewById , вам нужно фактическое представление. Вы можете использовать этот метод только в классах Activity , Fragment или View .
Передайте ссылку и не делайте того, что не должны делать ваши классы:
Затем вызовите конструктор:
Чистое решение должно дополнительно использовать WeakReference вместо ImageView , поскольку сохранение ссылки в длительных задачах может привести к утечке памяти.
Использование AsyncTask в качестве нестатического внутреннего класса не предотвратит ту же проблему, так как он также сохранит ссылку на действие, вызывая указанную утечку памяти.
Я предполагаю, что вы правильно справляетесь с обработкой нескольких загружаемых изображений. Но если это так, то ваш asyncTask должен проверить, существует ли ссылка на imageView. Вы должны идти в этом направлении:
Затем Вы звоните, например:
Вам необходимо объявить свой imageview как поле в вашей деятельности
Инициализируйте его при создании
ваша асинхронная задача:
Мое приложение Android должно: загрузите изображение на сервер сделайте 3 (быстрых) вызова веб-службы REST, используя загруженное изображение изображения получить вывод из веб-сервиса отображение вывода в пользовательском интерфейсе. Я не знаю, должен ли я использовать сервис или AsyncTask. Я.
Мое приложение будет использовать DataDroid для REST клиентских запросов. Некоторые ListViews в приложении будут отображать данные с фотографиями профиля, и эти фотографии не загружаются с REST / as JSON. Это прямые двоичные загрузки HTTP. Единственное, что REST запрашивается с сервера и хранится.
Похожие вопросы:
Я столкнулся с проблемой отображения изображения из интернета в моем приложении WPF: Для этой задачи я использовал BitmapImage . Моя первая попытка состояла в том, чтобы выполнить его в потоке UI.
Существует ли истинная асинхронная загрузка файла/ajax в grails, которая подключается к стандартному busy spinner (тому, который отображается при других вызовах ajax)? Или если бы я хотел показать.
В настоящее время я пытаюсь загрузить закодированное изображение base64 на сервер php, который затем хранит строку base64 в базе данных MySQL. В настоящее время код загружает данные и сохраняет их в.
Я пытаюсь получить изображение с URL по JSON данные, которые успешно работают. Все, что ниже, работает SLOWLY. Тем не менее, я пытаюсь найти способ заставить URL отображаться намного быстрее ниже в.
Я создаю приложение, которое принимает изображение android (захваченное камерой устройства), загружая его на сервер (сервлет). На сервере мне нужно работать с ним как с BufferdImage (или любым.
Мое приложение Android должно: загрузите изображение на сервер сделайте 3 (быстрых) вызова веб-службы REST, используя загруженное изображение изображения получить вывод из веб-сервиса отображение.
Мое приложение будет использовать DataDroid для REST клиентских запросов. Некоторые ListViews в приложении будут отображать данные с фотографиями профиля, и эти фотографии не загружаются с REST / as.
Я хотел бы обновить ячейку,где была выполнена асинхронная загрузка. Я знаю 2 способа сделать это, но ни один из них не является именно тем, что я хочу. Вот что я знаю: [myTableView reloadData]; Или.
Чтобы загрузить сайт быстрее, нам нужно позволить DOM загрузиться перед извлечением некритических активов сайта. Сценарий таков : 1) Оптимизация доставки CSS (загрузка после загрузки DOM) 2).
Я строю проект кода React native с использованием react-native-cli, есть ли вообще асинхронная загрузка шрифтов без Expo? Будет ли проблема просто импортировать < Font >из ‘expo’ в мой собственный.
Источник