Uso de Picasso con Image Getter

Estoy construyendo una aplicación de chat y estoy tratando de añadir una imagen a un EditText, mediante el uso de Picasso para obtener la imagen de una URL y la append y ImageGetter para adjuntar la imagen a la EditText. Sin embargo, lo que he implementado a continuación no funciona, ya que agregar mensajes al usar la aplicación muestra nada (pero el mensaje aparece en la base de datos).

He probado sin utilizar Picasso, simplemente utilizando el ImageGetter con un recurso de imagen dentro de la aplicación funciona bien, sólo que no es de una URL como es necesario.

¿Cuál es la forma correcta de configurar ImageGetter y / o el método append para que esta funcionalidad funcione con Picasso? ¿O hay una manera más simple?

Método Append:

public void appendToMessageHistory(final String username, final String message) { if (username != null && message != null) { Picasso.with(getBaseContext()) .load("http://localhost:3000/uploads/campaign/image/2/2.jpg") .into(new Target() { @Override public void onPrepareLoad(Drawable arg0) { } @Override public void onBitmapLoaded(Bitmap bitmap, LoadedFrom arg1) { Drawable drawImage = new BitmapDrawable( getBaseContext().getResources(), bitmap); drawImage.setBounds(0, 0, drawImage.getIntrinsicHeight(), drawImage.getIntrinsicWidth()); messageHistoryText.append(Html.fromHtml("<b>" + username + ":" + "</b>" + "<br>")); messageHistoryText.append(Html.fromHtml(message + "<hr>" + "<br>") + System.getProperty("line.separator") + ""); messageHistoryText.append(Html .fromHtml("<img src = '" + drawImage + "'/>", imageGetter, null)); } @Override public void onBitmapFailed(Drawable arg0) { } }); } } 

ImageGetter:

 ImageGetter imageGetter = new ImageGetter() { Drawable imageUsed=null; @Override public Drawable getDrawable(String source) { Picasso.with(getBaseContext()) .load("http://localhost:3000/uploads/campaign/image/2/2.jpg") .into(new Target() { @Override public void onPrepareLoad(Drawable arg0) { } @Override public void onBitmapLoaded(Bitmap bitmap, LoadedFrom arg1) { Drawable drawImage = new BitmapDrawable( getBaseContext().getResources(), bitmap); drawImage.setBounds(0, 0, drawImage.getIntrinsicHeight(), drawImage.getIntrinsicWidth()); imageUsed=drawImage; } @Override public void onBitmapFailed(Drawable arg0) { } }); return imageUsed; } }; 

No pude conseguir que funcionara con el objetivo de Picasso …

Mi solución es:

  • Utilizar un AsyncTask para la simultaneidad
  • Use el método get () de Picasso para cargar la imagen de forma síncrona en el método de fondo de AsyncTask

Me gusta esto:

 public class PicassoImageGetter implements Html.ImageGetter { final Resources resources; final Picasso pablo; final TextView textView; public PicassoImageGetter(final TextView textView, final Resources resources, final Picasso pablo) { this.textView = textView; this.resources = resources; this.pablo = pablo; } @Override public Drawable getDrawable(final String source) { final BitmapDrawablePlaceHolder result = new BitmapDrawablePlaceHolder(); new AsyncTask<Void, Void, Bitmap>() { @Override protected Bitmap doInBackground(final Void... meh) { try { return pablo.load(source).get(); } catch (Exception e) { return null; } } @Override protected void onPostExecute(final Bitmap bitmap) { try { final BitmapDrawable drawable = new BitmapDrawable(resources, bitmap); drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); result.setDrawable(drawable); result.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); textView.setText(textView.getText()); // invalidate() doesn't work correctly... } catch (Exception e) { /* nom nom nom*/ } } }.execute((Void) null); return result; } static class BitmapDrawablePlaceHolder extends BitmapDrawable { protected Drawable drawable; @Override public void draw(final Canvas canvas) { if (drawable != null) { drawable.draw(canvas); } } public void setDrawable(Drawable drawable) { this.drawable = drawable; } } 

Espero que esto sea útil.

Construí sobre la respuesta de Thomas. Utilicé los métodos existentes de Picasso para descargar cualquier imagen en un diverso hilo y explicado para el marcador de posición Drawables también.

 public class PicassoImageGetter implements Html.ImageGetter { private TextView textView = null; public PicassoImageGetter() {} public PicassoImageGetter(TextView target) { textView = target; } @Override public Drawable getDrawable(String source) { BitmapDrawablePlaceHolder drawable = new BitmapDrawablePlaceHolder(); Context context = FeedSurferApp.getContext(); FeedSurferApp .getPicasso() .load(source) .error(ResourcesCompat.getDrawable(context.getResources(), R.drawable.connection_error, context.getTheme())) .into(drawable); return drawable; } private class BitmapDrawablePlaceHolder extends BitmapDrawable implements Target { protected Drawable drawable; @Override public void draw(final Canvas canvas) { if (drawable != null) { drawable.draw(canvas); } } public void setDrawable(Drawable drawable) { this.drawable = drawable; drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); if (textView != null) { textView.setText(textView.getText()); } } @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { setDrawable(new BitmapDrawable(FeedSurferApp.getContext().getResources(), bitmap)); } @Override public void onBitmapFailed(Drawable errorDrawable) { setDrawable(errorDrawable); } @Override public void onPrepareLoad(Drawable placeHolderDrawable) {} } } 

He encontrado una manera de utilizar ImageGetter con Picasso Target:

  public Drawable getDrawable(String source) { final BitmapDrawablePlaceHolder result = new BitmapDrawablePlaceHolder(); Picasso.with(getContext()).load(source).into(new Target() { @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { final BitmapDrawable drawable = new BitmapDrawable(mContext.getResources(), bitmap); drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); result.setDrawable(drawable); result.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); content.setText(content.getText()); // cache is now warmed up } @Override public void onBitmapFailed(Drawable errorDrawable) { } @Override public void onPrepareLoad(Drawable placeHolderDrawable) { } }); return result; 

}

Esto utiliza el caché y ya no es una llamada síncrona que requiere el AsyncTask.

Crédito para: ¿ Buscar imágenes con Callback en Picasso?

  • Cómo cargar diseño de fondo utilizando Picasso
  • Picasso para cargar matriz de bytes
  • Picasso no funciona si url contiene espacio
  • Cómo cargar un mapa de bits en una vista de imagen con Picasso
  • Biblioteca de Android Picasso o Glide?
  • Imágenes de Picasso Library y GridView
  • Cambiar el tamaño de la imagen a todo el ancho y la altura variable con Picasso
  • Imagen parpadeando mientras se desplaza en RecyclerView
  • Picasso: fuera de la memoria
  • A / Looper: No se pudo crear el tubo de estela. Errno = 24
  • ¿Por qué utilizar la biblioteca de Android Picasso para descargar imágenes?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.