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
- ¿Cómo funciona la caché HTTP de Android?
- Picasso ejecutar primero no llamar onBitmapLoaded in for loop
- ViewPager demasiado lento al desplazar (con Picasso)
- Android Picasso Configurar el tamaño de LruCache
- Uso de Fresco de Facebook para cargar un mapa de bits
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.
- Añadir imagen de fondo a Android ListView con Picasso
- Lenta Cargando imágenes grandes con Picasso
- Picasso y contexto
- Memoria caché de picasso para Android
- Cómo probar si una imagen está completamente cargada con Picasso
- Mostrar una imagen "Cargando ..." mientras carga el fondo de la imagen con Picasso
- Acercamiento a las imágenes de Android en DB
- Conseguir que Picasso recupere las imágenes futuras
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.
- Reemplazar fragmento en ViewPager muestra pantalla en blanco?
- ¿Cómo insertar un log en LogCat que cuando hago clic en salta a su línea en el código?