添加标记从URL毕加索 [英] Adding markers from url with Picasso

查看:170
本文介绍了添加标记从URL毕加索的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是从一个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我的问题是这是做到这一点的最好办法,如果没有什么其他选择,我可以试试。

解决方案
  

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

     

所以,更好的方法是每个目标添加到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) {

        }
    }

这篇关于添加标记从URL毕加索的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆