android-progressbar - squareup - picasso picasso
¿Cómo usar la barra de progreso al cargar la imagen en picasso? (2)
Quiero que el método onStart() cargue la imagen desde el servidor usando picasso y quiero mostrar una barra de progreso hasta que las fotos se descarguen completamente. Aquí está mi código:
@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();
}
Es una pregunta antigua, pero puede ser que esta respuesta pueda ayudar a otros, ya que también tuve problemas para mostrar la barra de progreso al cargar la imagen desde el servidor.
Estoy usando Picasso 2.4.0. y estoy usando la interfaz de Picasso Target para cargar la imagen en la vista de imagen. Aquí está el código probado y de trabajo:
Primero agregue las siguientes líneas:
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);
Aquí está la implementación de la interfaz de destino utilizada anteriormente
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);
}
}
}
El código anterior funciona bien si se usa para cargar imágenes en actividad. Pero si desea cargar una imagen en gridview / recyclerview o ver un paginador, etc., donde se utiliza el mismo titular de vista, es posible que tenga un problema donde no se llame a onBitmapLoaded () (ya que la vista se recicla y Picasso solo mantiene una referencia débil a Objeto de destino). Aquí hay un enlace para resolver este problema.
No he probado su código, pero incluso si eso funciona, el archivo actress_wallpaper.jpg no se carga en ImageView. En los documentos, dice.
Los objetos que implementan esta clase deben tener una implementación funcional de
Object.equals(Object)yObject.hashCode()para un almacenamiento interno adecuado.
Prueba esto:
File file = new File(pathToFile);
Picasso.with(context)
.load(file)
.into(imageView, new Callback() {
@Override
public void onSuccess() {
progressbar.setVisibility(View.GONE);
}
});
Tenga en cuenta que no he probado mi código.
Actualizar:
He probado la versión 2.3.2 y 2.3.3, parece que hay un problema https://github.com/square/picasso/issues/539