Adición de marcadores de url con Picasso

Estoy agregando marcadores a mi mapa desde una url usando la biblioteca de Picasso

Como un marcador no es un ImageView He intentado utilizar un objetivo en su lugar

for(int x =0; x < mapIcon_url.length; x++){ Picasso.with(getActivity()).load(mapIcon_url[x]).resize(marker_size, marker_size+15).into(new Target() { @Override public void onSuccess(Bitmap b) { bitmapMarker = BitmapDescriptorFactory.fromBitmap(b); //create marker option if(b != null) markerOptions = new MarkerOptions().position(marker_position).icon(bitmapMarker)); else markerOptions = new MarkerOptions().position(marker_position).icon(BitmapDescriptorFactory.fromResource(R.drawable.placeholder_pin)).snippet(String.valueOf(x)); marker = map.addMarker(markerOptions); } @Override public void onError() { //create marker option markerOptions = new MarkerOptions().position(marker_position).icon(BitmapDescriptorFactory.fromResource(R.drawable.placeholder_pin)).snippet(String.valueOf(x)); marker = map.addMarker(markerOptions); } }); } 

Estoy haciendo esto en un bucle para agregar cerca de 20 marcadores pero encuentro que en la primera ejecución del código solamente 5 o 7 marcadores se agregan así que he cambiado a usar el lib y un AsyncTask como esto.

 for(int x =0; x < mapIcon_url.length; x++){ new AddMarker().execute(mapIcon_url[x]); } public class AddMarker extends AsyncTask<String, Integer, BitmapDescriptor> { BitmapDescriptor bitmapMarker1; VenueDetails myVenue; @Override protected BitmapDescriptor doInBackground(String... url) { myUrl = url[0]; try { bitmapMarker1 = BitmapDescriptorFactory.fromBitmap(Picasso.with(getActivity()).load(myUrl).resize(marker_size, marker_size+15).get()); } catch (IOException e) { e.printStackTrace(); } return bitmapMarker1; } protected void onPostExecute(BitmapDescriptor icon) { try { map.addMarker(new MarkerOptions().position(marker_position).icon(icon))); } catch (Exception e) { e.printStackTrace(); } } } 

Sin embargo, estoy un poco preocupado por este método podría darme algunos problemas cuando tengo un montón de marcadores decir acerca de 100. Mi pregunta sería que es la mejor manera de hacer esto y si no lo que otras opciones puedo probar.

Debe mantener una referencia para cada objetivo, de lo contrario el sistema los libera automáticamente cuando se invoca el recolector de elementos no utilizados.

Por lo tanto, la mejor solución es agregar cada destino a un HashSet y luego en los métodos onBitmapLoaded () y onBitmapFailed de Target, quitar el objetivo mismo del conjunto.

Gracias por la sugerencia, ahora mi código funciona perfectamente. Debajo de las piezas de código que implementan su sugerencia.

 [...]//Global var private Set<PoiTarget> poiTargets = new HashSet<PoiTarget>(); [...] private void somewhere(){ PoiTarget pt; for(Item item: data) { m = map.addMarker(new MarkerOptions() .position(new LatLng(item.latitude, item.longitude)) .title(item.title)); pt = new PoiTarget(m); poiTargets.add(pt); Picasso.with(context) .load(mapImageURLString) .into(pt); } } [...] //-------------------------------------------------------- // Inner class //-------------------------------------------------------- class PoiTarget implements Target{ private Marker m; public PoiTarget(Marker m) { this.m = m; } @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { m.setIcon(BitmapDescriptorFactory.fromBitmap(bitmap)); poiTargets.remove(this); Tools.msg(" @+ Set bitmap for "+m.getTitle()+" PT size: #"+poiTargets.size()); } @Override public void onBitmapFailed(Drawable errorDrawable) { Tools.msg(" @+ [ERROR] Don't set bitmap for "+m.getTitle()); poiTargets.remove(this); } @Override public void onPrepareLoad(Drawable placeHolderDrawable) { } } 

Debe mantener una referencia para cada Target , de lo contrario el sistema los libera automáticamente cuando se invoca el recolector de elementos no utilizados.

Por lo tanto, la mejor solución es agregar cada destino a un HashSet y luego en los onBitmapLoaded() y onBitmapFailed de Target, quitar el objetivo mismo del conjunto.

  • Picasso carga imagen con triángulo en la esquina de la imagen
  • Transición de elementos compartidos de Android: transformación de un ImageView de un círculo a un rectángulo y viceversa
  • Picasso: cómo cancelar todas las peticiones de imagen hechas en un adaptador
  • Imágenes de Picasso Library y GridView
  • ¿Cómo obtengo el mapa de bits resultante de una imagen después de haber sido redimensionado en una vista de imagen con picasso
  • Picasso no puede cargar imagen dentro del método onSuccess de StorageReference
  • ¿Está bien crear una nueva instancia de picasso cada vez
  • Android Picasso - Cómo obtener estadísticas sobre accesos y descargas de caché
  • Imagen de carga animada en picasso
  • Picasso carga imágenes con una imagen errónea en un adaptador de lista
  • Picasso onBitmapLoaded nunca llamado
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.