android - 使用 Picasso 从 url 添加标记

标签 android google-maps-markers android-maps-v2 picasso

我正在使用 Picasso library 从 url 向我的 map 添加标记

由于标记不是 ImageView,我尝试使用 Target 代替

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);

        }
    }); 
}   

我在一个循环中执行此操作以添加大约 20 个标记,但我发现在第一次运行代码时只添加了 5 或 7 个标记,因此我已切换到使用 lib 和这样的 AsyncTask。

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();
        }
    }
}   

但是我有点担心当我有很多标记说大约 100 时,这种方法可能会给我带来一些问题。我的问题是这是最好的方法吗?如果不是,我可以尝试其他什么选择。

最佳答案

You have to keep a reference for each Target, otherwise the system automatically releases them when the garbage collector is invoked.

So, the better solution is add each Target to a HashSet and then in onBitmapLoaded() and onBitmapFailed methods from Target, remove the Target itself from the set.

感谢您的建议,现在我的代码可以完美运行了。在实现您的建议的代码段下方。

[...]//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) {

        }
    }

关于android - 使用 Picasso 从 url 添加标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18548528/

相关文章:

java - 音频记录和播放失败-Android AudioRecord&AudioTrack

android - 如何通过 zxing-android-embedded in Android 停止连续扫描

android - 如何使用 Picasso 为 Google Marker 自定义图标创建语音气泡边框?

android - 通过更改 Android 中的 Z-Index 将 Google map 标记置于最前面

android - Google Maps Android API v2 仅适用于一部手机

android - 如何像uber android应用程序一样在 map 上获取居中位置图钉的位置

android - 在 Android 中使用 Transitions 的 ImageButton

java - 通过三个坐标填充三角形内的颜色

android - 在 Android 中的谷歌地图位置上设置名称和标题

android - 为什么 Android location.distanceTo 返回以百万为单位的值?