Кэширование изображений Пикассо
Я хочу загрузить следующий код загрузки изображений с помощью кэша изображений Picasso.
DownloadImage downloadImage = new DownloadImage();
downloadImage.execute(advert.getImgUrl());
private class DownloadImage extends AsyncTask<String, Void, Bitmap> {
@Override
protected Bitmap doInBackground(String... arg) {
Bitmap bmp = null;
try {
URL url = new URL(arg[0]);
bmp = BitmapFactory.decodeStream(url.openConnection()
.getInputStream());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
return null;
}
return bmp;
}
@Override
protected void onPostExecute(Bitmap result) {
if (result == null) {
Intent intent = new Intent(AdvertisingActivity.this,
AdvertisingErrorActivity.class);
intent.putExtra("ad-error", "Error downloading image");
}
adImg.setImageBitmap(result);
super.onPostExecute(result);
}
}
У меня есть несколько вопросов по этому поводу.
Я хочу загрузить более одного изображения параллельно. Если я сделаю повторные звонки
Picasso.with(getActivity()).load(url);
с различными значениями URL, это сделано?Я хочу загрузить изображения в одном упражнении и использовать его в другом упражнении. Это возможно? Как это может быть сделано?
Если я позвоню
Picasso.with(getActivity()).load(url);
более одного раза с тем же значением URL, загружает ли это кэшированные изображения для последующих вызовов после загрузки изображения?Если по какой-либо причине процесс загрузки изображения не завершился успешно, вы можете заставить Picasso сообщить вам об ошибке?
1 ответ
Я изучил еще несколько вопросов и решил, что я должен опубликовать это как ответ, а не как комментарий.
- Да - Picasso загружает изображения асинхронно, поэтому повторные вызовы будут загружать изображения параллельно.
- Да - просто сделайте вызов как обычно, и Picasso будет обрабатывать повторное использование загруженных изображений, например, в Activity1, вызов
Picasso.with(this).load("image1");
и позже позвоните по тому же URL-адресу в Activity2. Изображение уже будет кэшировано (либо в памяти, либо в памяти устройства), и Picasso будет использовать его повторно, а не загружать снова. - Да - см. Выше (Пикассо будет автоматически использовать кэшированные изображения, если они доступны)
Это, кажется, не имеет такого четкого ответа. Одна вещь, которую вы можете сделать, это предоставить изображение для отображения, если при извлечении реального изображения происходит ошибка:
Picasso.with(context) .load(url) .placeholder(R.drawable.user_placeholder) .error(R.drawable.user_placeholder_error) .into(imageView);
"Заполнитель" будет отображаться, пока делается попытка извлечь изображение из Интернета; изображение "ошибки" будет отображаться, например, если URL-адрес недействителен или если нет подключения к Интернету.
Обновление от 17.03.2014:
Picasso поддерживает использование обратного вызова для сообщения о сбое. Измените ваш обычный вызов (например, приведенный выше пример) следующим образом:
.into(imageView, new Callback() { @Override public void onSuccess() { // TODO Auto-generated method stub } @Override public void onError() { // TODO Auto-generated method stub } });
В заключение, кажется, что Пикассо будет отличным выбором для вас. Это определенно делает загрузку изображений очень быстрой и очень простой, поэтому мне она очень нравится.