tutorial squareup last implement context android-progressbar picasso

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) y Object.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