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