Использование библиотеки Volley в Android на примере получения данных из погодного API


Что такое кэшированные данные

Уровни кэш-памяти

Слово Cache с английского языка – «тайник». Когда человек впервые посещает веб-сайт, открывает приложение или программу, телефон автоматически начинает запись появившейся страницы – кэширование. Загруженные данные остаются на устройстве в виде временных или постоянных файлов. При повторном просмотре сохраненная информация позволяет быстро воспроизвести исходную страницу.

Скрытая память android бывает 3 типов.

Dalvik-Cache

Временные файлы кодов установленных приложений хранятся на промежуточном буфере и для быстрого доступа могут запрашиваться виртуальной машиной Dalvik. На таком программном обеспечении осуществляется работа всех телефонов на базе Андроид.

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

Впоследствии система может заново восстановить утраченные файлы.

Системный кэш

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

Проводить очищение нужных программ считается нецелесообразным.

Кэш в приложениях на телефоне

В программах, которые пользователь скачивает из интернета самостоятельно, кэшированные данные содержат все сведения о работе приложения и настройках. Они занимают определенное количество памяти.

Постоянные файлы создаются для быстрого входа в игры и программы с большим объемом.

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

Локальная копия создается с помощью браузера.

  • Молоко с медом: рецепты
  • Как за неделю похудеть на 3 кг — эффективные способы
  • Ультразвуковой увлажнитель воздуха — обзор моделей. Как выбрать лучший ультразвуковой увлажнитель для дома

Зачем нужно очищать кэш?

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

Также вам обязательно нужно знать для чего необходима папка Thumbnails занимающее более ГБ памяти вашего устройства и как удалив её освободить значимую часть памяти Андроид устройства.

В процессе работы вашего устройства его Cache начинает переполняться множеством разнообразных данных. Фотографии, которые вы когда-то смотрели, сайты, которые как-то посещали, приложения, которые запускали – все это оставляет след в памяти вашего устройства. Причём, в большинстве случаев, такие кэшированные данные лежат бесполезным грузом, ведь существует множество сайтов, которые мы посетили только раз, приложения, которые запускали только раз, фото, которые более не посмотрим и так далее.

Поэтому, дабы кэшированные данные не забивали память вашего устройства под завязку и не способствовали появлению ошибки DF-DLA 15, рекомендуется регулярно чистить кэш. Как это сделать я расскажу ниже.

Где находятся и зачем нужны

Временные файлы не только увеличивают скорость загрузки, экономят трафик, но и помогают пользователю сохранить прогресс в приложениях. Кэшированные данные сторонних программ и системные сведения находятся в отдельной папке на внутреннем накопителе и иногда занимают значительный объем телефонной памяти. Исключение составляют приложения, которые можно установить или переместить на съемное запоминающее устройство. Информация копируется на внешний накопитель.

Можно ли не чистить кэш

Вовсе не обязательно удалять остаточные файлы и ссылки часто запрашиваемой информации. Каждый пользователь самостоятельно решает, как ему поступить.

Когда памяти на смартфоне достаточно (в том числе и для сохранения системного «мусора»), то в чистке кэша нет никакой необходимости.

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

Обычно установленный по умолчанию софт в системе смартфона не ограничивает его производительность, поскольку разработчики тщательно продумывают этот момент. Однако дальнейший серфинг, скачивание приложений и файлов делают свое дело, сильно утяжеляя кэш. И хоть кэширование – однозначно полезная функция, в значительной мере ускоряющая работу устройств, решающую роль в этом вопросе все же будет играть наличие достаточного объёма хранилища.

Как очистить кэш на смартфоне

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

Очистить кэш на андроиде возможно через внутренние ресурсы аппарата или с помощью установленных программ.

Вручную

  1. Войти в настройки телефона и найти раздел «Приложения». В открывшемся окне отобразятся все системные, установленные и активные программы.
  2. Выбрать ту, которой нужна очистка, и кликнуть по ней. Графа «Память» будет отображать данные о размере приложения.
  3. Внизу появится кнопка «Очистить кэш». После нажатия система попросит подтвердить действие.

Автоматическая очистка

Использование специальных программ помогает найти кэш в телефоне и стереть лишние данные автоматически. Их желательно скачивать из магазина, который предусмотрен на устройстве.

Большинство приложений имеют понятный интерфейс, две версии – полную, облегченную.

Самые популярные программы:

  1. «Clean Master». Удаляет кэш вместе с остаточными файлами ежедневно. При желании можно настроить точное время.
  2. «App Cache Cleaner». Помогает не только избавиться от лишних данных, но и переносит файлы с внутреннего хранилища на съемную карту памяти.
  3. «Power Clean». Удаляет даже ту информацию, которая давно не открывалась на устройстве.

Как и когда делать очистку данных и кэша приложения

Советы

Любому, кто когда-либо сталкивался с проблемой, касающейся приложения или программного обеспечения на Android, можно дать совет очистить кэш приложения или очистить данные приложения.

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

Что означает очистка кэша приложения?

Кэш – это область временного хранения информации на устройстве, которая сохраняет определенные типы данных. Она способна ускорить быстроту и плавность работы девайса, плюс, сокращает количество обрабатываемых и используемых данных.

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

Часто нет необходимости вручную управлять кэшированными данными: Android способна сама выполнять этим процессом. Однако если приложение начинает плохо себя вести или перестает работать, вы можете вручную осуществить нужные действия.

Схема «Настройки>Память>Данные кэша» дает решение в одно касание для удаления данных кэша.

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

Что означает очистка данных приложения?

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

Очистка данных сбрасывает приложение в состояние по умолчанию: оно делает ваше приложение таким же, как при первой загрузке и установке. Например, скажем, вы вносите изменения в настройки вашего любимого приложения для фитнеса. Вы изменяете продолжительность упражнений и настройки звука. Очистка кэша не повлияет на эти сохраненные настройки. Очистка сохраненных данных может и, по всей вероятности, полностью удалит их.

Оптимизировать запрос изображения

Панель инструментов Volley предоставляет стандартный кэш, реализованный с помощью класса DiskBasedCache. Этот класс может кэшировать файлы в указанный каталог на диске. Но для того, чтобы использовать ImageLoader, мы должны предоставить пользовательский кэш растрового изображения LRC, который реализует интерфейс ImageLoader.ImageCache. Мы можем захотеть установить кеш как синглтон.

Ниже приведен пример реализации класса памяти LruBitmapCache. Он наследует класс LruCache и реализует интерфейс ImageLoader.ImageCache:

import android.graphics.Bitmap; import android.support.v4.util.LruCache; import android.util.DisplayMetrics; import com.android.volley.toolbox.ImageLoader.ImageCache; public class LruBitmapCache extends LruCache implements ImageCache { public LruBitmapCache(int maxSize) { super(maxSize); } public LruBitmapCache(Context ctx) { this(getCacheSize(ctx)); } @Override protected int sizeOf(String key, Bitmap value) { return value.getRowBytes() * value.getHeight(); } @Override public Bitmap getBitmap(String url) { return get(url); } @Override public void putBitmap(String url, Bitmap bitmap) { put(url, bitmap); } // Returns a cache size equal to approximately three screens worth of images. public static int getCacheSize(Context ctx) { final DisplayMetrics displayMetrics = ctx.getResources(). getDisplayMetrics(); final int screenWidth = displayMetrics.widthPixels; final int screenHeight = displayMetrics.heightPixels; // 4 bytes per pixel final int screenBytes = screenWidth * screenHeight * 4; return screenBytes * 3; } }

Ниже показано, как создать экземпляр ImageLoader:

RequestQueue mRequestQueue; // assume this exists. ImageLoader mImageLoader = new ImageLoader(mRequestQueue, new LruBitmapCache(LruBitmapCache.getCacheSize()));

Использование StringRequest

Volley предоставляет простой способ: Volley.newRequestQueue используется для создания для вас RequestQueue, использования значения по умолчанию и запуска очереди. Например:

TextView mTextView = (TextView) findViewById(R.id.text); … // Создать очередь запросов RequestQueue queue = Volley.newRequestQueue(this); String url =»https://www.baidu.com»; // Запрос на возврат данных типа String из сетевой ссылки для запроса StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener() { @Override public void onResponse(String response) { // Заполняем возвращенные данные в TextView mTextView.setText(«Response is: «+ response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { mTextView.setText(«That didn’t work!»); } }); // Добавить запрос в очередь запросов queue.add(stringRequest);

Кроме того, поскольку Volley хочет получить доступ к сети, не забудьте добавить следующие разрешения в свой файл AndroidManifest.xml:

Таким образом, мы можем получить HTML-код страницы Baidu.

Если мы просто хотим сделать один запрос и не хотим сохранять пул потоков, мы можем отправить простой запрос с помощью метода по умолчанию (Volley.newRequestqueue), создать RequestQueue в любое время и затем Метод stop () выполняется в ответ на обратный вызов для остановки операции.

Но более распространенным подходом является создание RequestQueue и установка его как одиночного. Следующий раздел продемонстрирует этот подход.

Использование JsonRequest

Volley предоставляет следующие классы для запроса данных Json:

  • JsonArrayRequest-запрос на получение тела ответа массива Json для данного URL.
  • JsonObjectRequest-запрос на получение тела ответа объекта Json по указанному URL. Разрешить передачу необязательного JSONObject как части тела запроса.

    Оба эти класса основаны на общем базовом классе, JsonRequest. Их использование практически идентично StringRequest.

TextView mTxtDisplay; mTxtDisplay = (TextView) findViewById(R.id.txtDisplay); String url = «https://172.30.18.222:8080/weather.html»; // Используем класс singleton для построения очереди запросов RequestQueue queue = MySingleton.getInstance(this.getApplicationContext()). getRequestQueue(); JsonObjectRequest jsObjRequest = new JsonObjectRequest (Request.Method.GET, url, NULL, new Response.Listener() { @Override public void onResponse(JSONObject response) { mTxtDisplay.setText(«Response: » + response.toString()); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // TODO Auto-generated method stub } }); // Добавить запрос в очередь запросов с одноэлементным классом MySingleton.getInstance(this).addToRequestQueue(jsObjRequest);

Использование NetworkImageView

Однако, если все, что нам нужно сделать, это установить изображение для ImageView, то мы также можем использовать NetworkImageView для его достижения.

В XML-файле макета мы используем NetworkImageView так же, как ImageView:

ImageLoader mImageLoader; NetworkImageView mNetworkImageView; private static final String IMAGE_URL = «https://developer.android.com/images/training/system-ui.png»; … // Получить элемент управления NetworkImageView mNetworkImageView = (NetworkImageView) findViewById(R.id.networkImageView); // Получить объект ImageLoader mImageLoader = MySingleton.getInstance(this).getImageLoader(); // Set the URL of the image that should be loaded into this view, and // specify the ImageLoader that will be used to make the request. mNetworkImageView.setImageUrl(IMAGE_URL, mImageLoader);

Приведенный выше код обращается к RequestQueue и ImageLoader через одноэлементные классы. Такой подход гарантирует, что наше приложение создает синглтоны этих классов, которые будут продолжать существовать в жизненном цикле приложения. Это важно для ImageLoader (вспомогательный класс, используемый для обработки загрузки и кэширования изображений): основная функция кэша памяти — разрешить вращение без дрожания. Использование одноэлементного режима может сделать кэш растрового изображения длиннее, чем активность. Если мы создадим ImageLoader в действии, этот ImageLoader может быть воссоздан при каждом повороте устройства. Это может вызвать дрожание.

Запросить изображение

Volley предоставляет следующие классы для запроса изображений:

  • ImageRequest———— Инкапсулированный, используемый для обработки изображения запроса URL и возврата декодированного растрового изображения. Он также предоставляет несколько удобных методов интерфейса, таких как указание размера для повторной резки. Его основное преимущество заключается в том, что Volley обеспечит выполнение трудоемких операций, таких как декодирование и изменение размера, в рабочем потоке.
  • ImageLoader———— Вспомогательный класс для загрузки и кэширования изображений, полученных из сети. ImageLoader является координатором большого количества ImageRequests. Например, когда в ListView необходимо отобразить большое количество миниатюр. ImageLoader обеспечивает более перспективный кеш памяти для обычного кеша Volley, который очень полезен для предотвращения дрожания изображения. Это также позволяет достигать попаданий в кэш без блокировки или задержки основного потока (это невозможно с дисковым вводом / выводом). ImageLoader также может реализовать объединение ответов, избегая настройки растрового изображения для просмотра почти при каждом ответном обратном вызове. Синдикация ответов позволяет одновременно отправлять несколько ответов, что повышает производительность.
  • NetworkImageView———— Создан на основе ImageLoader и эффективно заменяет ImageView в случае изображений, полученных через сетевой URL-адрес. Если представление отделено от иерархии, NetworkImageView также может отменить отложенные запросы.

Использовать шаблон синглтона

Если нашему приложению необходимо продолжать использовать сеть, более эффективным способом должно быть создание единственного экземпляра RequestQueue, чтобы его можно было поддерживать в течение всего жизненного цикла приложения. Мы можем реализовать этот синглтон разными способами.Рекомендуемый способ — реализовать одноэлементный класс, который инкапсулирует объект RequestQueue и другие функции Volley.Другой метод — расширить класс Application и создать RequestQueue в методе Application.OnCreate (). Но мы не рекомендуем этот метод,Потому что статический синглтон может обеспечить ту же функциональность более модульным способом.

Ключевой концепцией является то, что RequestQueue должен создаваться с использованием контекста приложения, а не контекста Activity.Это гарантирует, что RequestQueue переживет жизненный цикл нашего приложения и не будет воссоздан из-за повторного создания действия (например, когда пользователь поворачивает устройство).

Ниже приведен одноэлементный класс, который предоставляет функции RequestQueue и ImageLoader:

public class MySingleton { private static MySingleton mInstance; private RequestQueue mRequestQueue; private ImageLoader mImageLoader; private static Context mCtx; private MySingleton(Context context) { mCtx = context; mRequestQueue = getRequestQueue(); mImageLoader = new ImageLoader(mRequestQueue, new ImageLoader.ImageCache() { private final LruCache cache = new LruCache(20); @Override public Bitmap getBitmap(String url) { return cache.get(url); } @Override public void putBitmap(String url, Bitmap bitmap) { cache.put(url, bitmap); } }); } public static synchronized MySingleton getInstance(Context context) { if (mInstance == NULL) { mInstance = new MySingleton(context); } return mInstance; } public RequestQueue getRequestQueue() { if (mRequestQueue == NULL) { // getApplicationContext() is key, it keeps you from leaking the // Activity or BroadcastReceiver if someone passes one in. mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext()); } return mRequestQueue; } public void addToRequestQueue(Request req) { getRequestQueue().add(req); } public ImageLoader getImageLoader() { return mImageLoader; } }

Затем мы можем использовать класс singleton для построения RequestQueue:

RequestQueue queue = MySingleton.getInstance(this.getApplicationContext()). getRequestQueue(); … // Добавить запрос в очередь запросов MySingleton.getInstance(this).addToRequestQueue(stringRequest);

Использование ImageLoader

Мы также можем использовать сам ImageLoader для отображения изображения.

ImageLoader mImageLoader; ImageView mImageView; private static final String IMAGE_URL = «hhttps://img3.imgtn.bdimg.com/it/u=715900948,1406530055&fm=21&gp=0.jpg»; … mImageView = (ImageView) findViewById(R.id.regularImageView); // Получить объект ImageLoder через класс singleton mImageLoader = MySingleton.getInstance(this).getImageLoader(); mImageLoader.get(IMAGE_URL, ImageLoader.getImageListener(mImageView, R.drawable.def_image, R.drawable.err_image));

Метод get () получает два параметра: первый параметр — это URL-адрес изображения, а второй параметр — объект ImageListener, инкапсулированный в одноэлементный класс. Первый параметр в методе getImageListener () указывает элемент управления ImageView, используемый для отображения изображения, второй параметр указывает изображение, отображаемое во время загрузки изображения, и третий параметр указывает изображение, отображаемое при сбое загрузки изображения.

Вы также можете получить указанное изображение, запустив программу.

Рейтинг
( 1 оценка, среднее 4 из 5 )
Понравилась статья? Поделиться с друзьями: