Hug*_*oss 8 android google-maps-markers android-maps-v2 picasso
我正在使用Picasso库从网址添加标记到我的地图
由于标记不是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);
}
});
}
Run Code Online (Sandbox Code Playgroud)
我在循环中执行此操作以添加大约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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
然而,我有点担心这种方法可能会给我一些问题,当我有很多标记说100左右.我的问题是这是最好的方法来做到这一点,如果没有,我可以尝试其他选项.
Fra*_*rio 10
您必须为每个Target保留一个引用,否则系统会在调用垃圾收集器时自动释放它们.
因此,更好的解决方案是将每个Target添加到HashSet,然后在Target中的onBitmapLoaded()和onBitmapFailed方法中,从集合中删除Target本身.
感谢您的建议,现在我的代码完美无缺.在实现您的建议的代码片段下面.
[...]//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) {
}
}
Run Code Online (Sandbox Code Playgroud)
你必须为每个人保留一个参考Target,否则系统会在调用垃圾收集器时自动释放它们。
因此,更好的解决方案是将每个 Target 添加到 a HashSet,然后在onBitmapLoaded()TargetonBitmapFailed的方法中,从集合中删除 Target 本身。
| 归档时间: |
|
| 查看次数: |
4118 次 |
| 最近记录: |