添加标记从URL毕加索毕加索、标记、URL

2023-09-04 11:48:11 作者:此妖未成形

我是从一个URL使用毕加索库添加标记,以我的地图

作为标记不是一个ImageView的我试图用一个目标,而不是

 的for(int x = 0,X< mapIcon_url.length; X ++){

    Picasso.with(getActivity())。载荷(mapIcon_url [X])。调整(marker_size,marker_size + 15)。走进(新目标(){

        @覆盖
        公共无效的onSuccess(位图B){
            bitmapMarker = BitmapDesc​​riptorFactory.fromBitmap(B);


            //创建标记选项
            如果(B!= NULL)
                。markerOptions =新MarkerOptions()位置(marker_position).icon(bitmapMarker));
            其他
                markerOptions =新MarkerOptions().position(marker_position).icon(BitmapDescriptorFactory.fromResource(R.drawable.placeholder_pin)).snippet(String.valueOf(x));

            标记= map.addMarker(markerOptions);
        }

        @覆盖
        公共无效onerror的(){

            //创建标记选项
            markerOptions =新MarkerOptions().position(marker_position).icon(BitmapDescriptorFactory.fromResource(R.drawable.placeholder_pin)).snippet(String.valueOf(x));
            标记= map.addMarker(markerOptions);

        }
    });
}
 

我这样做在一个循环中添加约20标记,但我觉得对的code首次运行仅5或7标记添加所以我切换到使用lib和像这样的的AsyncTask

 的for(int x = 0,X< mapIcon_url.length; X ++){

    新AddMarker()执行(mapIcon_url [X])。
}


公共类AddMarker扩展的AsyncTask<字符串,整数,BitmapDesc​​riptor> {

    BitmapDesc​​riptor bitmapMarker1;
    VenueDetails myVenue;

    @覆盖
    保护BitmapDesc​​riptor doInBackground(字符串... URL){
        myUrl =网址[0];
        尝试 {
            bitmapMarker1 = BitmapDesc​​riptorFactory.fromBitmap(Picasso.with(getActivity())的负载(myUrl).resize(marker_size,marker_size + 15)获得());
        }赶上(IOException异常E){
            e.printStackTrace();
        }

        返回bitmapMarker1;
    }

    保护无效onPostExecute(BitmapDesc​​riptor图标){

        尝试 {

            map.addMarker(新MarkerOptions()位置(marker_position).icon(图标)));

        }赶上(例外五){
            e.printStackTrace();
        }
    }
}
 

不过我有点担心这个方法可以给我一些问题,当我有很多的标记说约100我的问题是这是做到这一点的最好办法,如果没有什么其他选择,我可以试试。

解决方案   百度竞价教程之快速添加关键词url唯一标识

您必须保持对每个目标的参考,否则系统   调用垃圾收集器时自动释放它们。

     

所以,更好的方法是每个目标添加到HashSet,然后在   从目标onBitmapLoaded()和onBitmapFailed方法,去除   从设定的目标本身。

感谢你的建议,我现在的code正常工作。低于code实现你的建议的作品。

  [...] //全局变量
  私人设置< PoiTarget> poiTargets =新的HashSet< PoiTarget>();
[...]
 私人无效某处(){
    PoiTarget角;
    为(项目编号:数据){
        M = map.addMarker(新MarkerOptions()
               .position(新经纬度(item.latitude,item.longitude))
               .title伪(item.title));
        PT =新PoiTarget(M);
        poiTargets.add(PT);
        Picasso.with(上下文)
           .load(mapImageURLString)
           。走进(PT);
    }
}
[...]
// ------------------------------------------------ --------
//内部类
// ------------------------------------------------ --------
    类PoiTarget实现目标{
        私人标记米;

        公共PoiTarget(标记M){this.m =米; }

        @覆盖公共无效onBitmapLoaded(位图位图,Picasso.LoadedFrom从){
            m.setIcon(BitmapDesc​​riptorFactory.fromBitmap(位图));
            poiTargets.remove(本);
            Tools.msg(@ +设为位图+ m.getTitle()+PT尺寸:#+ poiTargets.size());
        }

        @覆盖公共无效onBitmapFailed(可绘制errorDrawable){
            Tools.msg(@ + [错误]不要设置位图+ m.getTitle());
            poiTargets.remove(本);
        }

        在prepareLoad @覆盖公共无效(可绘制placeHolderDrawable){

        }
    }
 

I'm adding markers to my map from a url using the Picasso library

As a marker isn't an ImageView I tried to use a Target instead

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

        }
    }); 
}   

I'm doing this in a loop to add about 20 markers but I find that on first run of the code only 5 or 7 markers are added so I've switched to using the lib and an AsyncTask like this.

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

However I'm a bit worried this method could give me some issues when I have alot of markers say about 100. My question would be is this the best way to do this and if not what other options can I try.

解决方案

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.

Thank you for the suggestion, now my code work perfectly. Below the pieces of code that implement your suggestion.

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

        }
    }