我有一个问题。
我的目标是加载公司的自定义图片,并将其显示为默认标记图标。
但我遇到了这个问题。
仅当我再次关闭并打开活动时才会显示图标。
以下是我在地图中添加标记的代码。
private void addMarkerToTheMap(GoogleMapInfoBundle infoBundle) {
if (infoBundle.placeMarker) {
LatLng latLng = new LatLng(infoBundle.company.getLatitude(), infoBundle.firm.getLongitude());
MarkerOptions markerOptions = new MarkerOptions()
.title(infoBundle.company.getName())
.snippet(infoBundle.company.getAddress())
.position(latLng);
Marker marker = mGoogleMap.addMarker(markerOptions);
try {
Picasso.with(this).load(NetworkUtils.getUrlOfScaledImage(infoBundle.company.getLogo(), DEFAULT_ICON_SCALE_PERCENTAGE)).into(new PicassoMarker(marker));
} catch (IllegalArgumentException ignore) {
// Do nothing
}
}
PicassoMarker
public class PicassoMarker implements Target {
Marker mMarker;
public PicassoMarker(Marker marker) {
mMarker = marker;
}
@Override
public int hashCode() {
return mMarker.hashCode();
}
@Override
public boolean equals(Object o) {
if (o instanceof PicassoMarker) {
Marker marker = ((PicassoMarker) o).mMarker;
return mMarker.equals(marker);
} else {
return false;
}
}
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
mMarker.setIcon(BitmapDescriptorFactory.fromBitmap(bitmap));
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
}
我试图用另一种方式制作它
MarkerOptions markerOptions = new MarkerOptions()
.title(infoBundle.company.getName())
.snippet(infoBundle.company.getAddress())
.position(latLng);
try {
Picasso.with(this).load(NetworkUtils.getUrlOfScaledImage(infoBundle.company.getLogo(), DEFAULT_ICON_SCALE_PERCENTAGE)).into(new PicassoMarker(mGoogleMap, markerOptions));
} catch (IllegalArgumentException ignore) {
// Do nothing
}
在下载图像后,在回调中将标记添加到地图中。
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
mMarkerOptions.icon(BitmapDescriptorFactory.fromBitmap(bitmap));
mGoogleMap.addMarker(mMarkerOptions);
}
在这种情况下,它没有显示任何标记。
但是在这两种情况下,如果我关闭Activity
并再次打开它,所有内容都将正确显示图标。
我不知道是什么原因造成了这样的问题。似乎GoogleMap
缓存了图标图像或其他内容。
我在使用GoogleMaps API
方面有一点经验,也许我错过了一些东西。
希望有人可以提供帮助。
感谢。
答案 0 :(得分:1)
问题不在于GoogleMap
或SupportMapFragment
,而在Picasso
,而不是Picasso
,而是在我的流程中。
您应该始终记住使用自定义Target
类的事情是内部Picasso
使用WeakReference
来存储Target
类,因此如果您只是创建新的Target
直接在Picasso
内调用它将被垃圾收集器销毁。
Picasso
提供Callback
类,因此您可以创建匿名类,并且您的类将保留引用。
但有一件事我错过Callback
类,在Bitmap
等响应中提供Target
(但目标主要由自定义视图使用)。
所以我找到了这样的解决方案,它很难看,但现在就是。
我已经创建了用于存储目标对象的特殊列表,而不是用于存储。
Marker marker = mGoogleMap.addMarker(markerOptions);
mMarkerCompanyMap.put(marker, infoBundle.firm);
try {
PicassoMarkerTarget markerTarget = new PicassoMarkerTarget(marker, mImageLoadingCallback);
mPicassoMarkerTargetList.add(markerTarget);
Picasso.with(this)
.load(NetworkUtils.getUrlOfScaledImage(infoBundle.firm.getLogo(), DEFAULT_ICON_SCALE_PERCENTAGE))
.into(markerTarget);
} catch (IllegalArgumentException ignore) {
// Do nothing
}
我正在通过mImageLoadingCallback
来回复来自Target
的活动
它看起来像。
private Callback mImageLoadingCallback = new Callback() {
@Override
public void onSuccess() {
Logger.logError("IMAGE LOADED IN CALLBACK " + mPendingImagesCount);
if (mPendingImagesCount <= 0) {
mPicassoMarkerTargetList.clear();
} else {
mPendingImagesCount--;
}
}
@Override
public void onError() {
// You may start laughing, but just for the sake of not duplicating code
onSuccess();
}
};
此回调可用于其他目的,但现在仅用于清除数组。
当然还有PicassoMarkerTarget
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
mMarker.setIcon(BitmapDescriptorFactory.fromBitmap(bitmap));
mDownloadListenerCallback.onSuccess();
Logger.logError("IMAGE LOADED IN PICASSO MARKER TARGET");
}
这是一个丑陋的解决方案,但也许这个回调在将来会有所帮助。
如果您知道如何更好地解决问题,请分享。 感谢。