Как использовать progressbar при загрузке изображения в picasso?
Я хочу, чтобы метод onStart()
загружал изображение с сервера с помощью picasso, и я хочу показать индикатор выполнения, пока фотографии не будут полностью загружены
Вот мой код:
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
Picasso.with(context).load(imageLoad)
.placeholder(R.id.progressBarDetails)
.error(R.drawable.friend_request).noFade().resize(200, 200)
.into(avatarImage, new Callback() {
@Override
public void onError() {
// TODO Auto-generated method stub
}
@Override
public void onSuccess() {
// TODO Auto-generated method stub
progressbar.setVisibility(View.GONE);
}
});
Picasso.with(this).load(imageLoad).into(target);
}
OnFinished a = new OnFinished() {
@Override
public void onSendFinished(IntentSender IntentSender, Intent intent,
int resultCode, String resultData, Bundle resultExtras) {
// TODO Auto-generated method stub
intent = new Intent(getApplicationContext(), Map.class);
}
};
private Target target = new Target() {
@Override
public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) {
new Thread(new Runnable() {
@Override
public void run() {
File file = new File(Environment
.getExternalStorageDirectory().getPath()
+ "/actress_wallpaper.jpg");
try {
file.createNewFile();
FileOutputStream ostream = new FileOutputStream(file);
bitmap.compress(CompressFormat.JPEG, 75, ostream);
ostream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
Ответы
Ответ 1
Я не тестировал ваш код, но даже если это работает, файл actress_wallpaper.jpg
не загружается в ImageView. В документах говорится:
Объекты, реализующие этот класс, должны иметь рабочую реализацию Object.equals(Object)
и Object.hashCode()
для внутреннего хранения.
Попробуйте следующее:
File file = new File(pathToFile);
Picasso.with(context)
.load(file)
.into(imageView, new Callback() {
@Override
public void onSuccess() {
progressbar.setVisibility(View.GONE);
}
});
быть предупрежденным, я не тестировал свой код.
Update:
Я пробовал версии 2.3.2 и 2.3.3, кажется, что там проблема https://github.com/square/picasso/issues/539
Ответ 2
Это старый вопрос, но может быть, этот ответ может помочь другим, поскольку у меня также были проблемы с отображением индикатора выполнения при загрузке изображения с сервера.
Я использую Picasso 2.4.0. и я использую интерфейс Picasso Target для загрузки изображения в режиме просмотра изображений. Вот протестированный и рабочий код:
Сначала добавьте следующие строки:
ImageView ivPhoto = (ImageView) findViewById(R.id.iv_photo);
ProgressBar pbLoadingBar = (ProgressBar) findViewById(R.id.pb_loading_bar);
//get image url
String imageUrl = getImageUrl();
//ImageViewTarget is the implementation of Target interface.
//code for this ImageViewTarget is in the end
Target target = new ImageViewTarget(ivPhoto, pbLoadingBar);
Picasso.with(mContext)
.load(imageUrl)
.placeholder(R.drawable.place_holder)
.error(R.drawable.error_drawable)
.into(target);
Вот реализация используемого выше интерфейса Target
private static class ImageViewTarget implements Target {
private WeakReference<ImageView> mImageViewReference;
private WeakReference<ProgressBar> mProgressBarReference;
public ImageViewTarget(ImageView imageView, ProgressBar progressBar) {
this.mImageViewReference = new WeakReference<>(imageView);
this.mProgressBarReference = new WeakReference<>(progressBar);
}
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
//you can use this bitmap to load image in image view or save it in image file like the one in the above question.
ImageView imageView = mImageViewReference.get();
if (imageView != null) {
imageView.setImageBitmap(bitmap);
}
ProgressBar progressBar = mProgressBarReference.get();
if (progressBar != null) {
progressBar.setVisibility(View.GONE);
}
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
ImageView imageView = mImageViewReference.get();
if (imageView != null) {
imageView.setImageDrawable(errorDrawable);
}
ProgressBar progressBar = mProgressBarReference.get();
if (progressBar != null) {
progressBar.setVisibility(View.GONE);
}
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
ImageView imageView = mImageViewReference.get();
if (imageView != null) {
imageView.setImageDrawable(placeHolderDrawable);
}
ProgressBar progressBar = mProgressBarReference.get();
if (progressBar != null) {
progressBar.setVisibility(View.VISIBLE);
}
}
}
Приведенный выше код работает отлично, если используется для загрузки изображения в действие. Но если вы хотите загрузить изображение в gridview/recyclerview или view pager и т.д., Где используется тот же держатель вида, вы можете получить проблему, где onBitmapLoaded() не вызывается (поскольку представление перерабатывается, а Picasso сохраняет слабую ссылку на объект Target). Здесь ссылка для решения этой проблемы.