【发布时间】:2016-06-27 07:44:17
【问题描述】:
我有Activity 和GoogleMap,我向服务器发送请求,解析JSON 响应并添加Markers,使用毕加索加载图标。
问题
接下来的问题是:当我关闭应用程序并再次打开它时,数据也会加载(网址也加载得很好),Markers 会添加到GoogleMap,但它们有默认图标,Picasso 不会加载新图标图标(未调用 onBitmapLoaded())。当我完成Activity 并重新启动它(没有关闭应用程序)时,新标记的图标也会加载。
我对毕加索目标的实现:
public class PicassoMarker implements Target {
private static final String TAG = "PicassoMarker";
private Marker marker;
private LoadingCallBacks loadingCallBacks;
public PicassoMarker(Marker marker) {
this.marker = marker;
}
public PicassoMarker(Marker marker, LoadingCallBacks loadingCallBacks) {
this.marker = marker;
this.loadingCallBacks = loadingCallBacks;
}
@Override
public int hashCode() {
return marker.hashCode();
}
@Override
public boolean equals(Object o) {
if (o instanceof PicassoMarker) {
Marker marker = ((PicassoMarker) o).marker;
return this.marker.equals(marker);
} else {
return false;
}
}
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
marker.setIcon(BitmapDescriptorFactory.fromBitmap(bitmap));
Log.d(TAG, "onBitmapLoaded() -> " +
"\nBitmap:" +
"\n\twidth: " + bitmap.getWidth() +
"\n\theight: " + bitmap.getHeight() /*+
"\nCanvas:" +
"\n\twidth: " + resultBitmap.getWidth() +
"\n\theight: " + resultBitmap.getHeight()*/
);
if (loadingCallBacks != null) {
loadingCallBacks.onLoaded(bitmap);
}
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
Log.e(TAG, "onBitmapFailed()");
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
Log.d(TAG, "onPrepareLoad()");
}
public void setLoadingCallBacks(LoadingCallBacks loadingCallBacks) {
this.loadingCallBacks = loadingCallBacks;
}
public interface LoadingCallBacks {
void onLoaded(Bitmap bitmap);
}
}
还有我的AsyncTask 用于发送请求并添加Markers:
new AsyncTask<String, Void, ArrayList<MarkerDataModel>>() {
private ArrayList<MarkerDataModel> markerDataModels = new ArrayList<>();
@Override
protected void onPreExecute() {
}
@Override
protected ArrayList<MarkerDataModel> doInBackground(String... params) {
// Parsing JSON ...
return markerDataModels;
}
@Override
protected void onPostExecute(ArrayList<MarkerDataModel> markerDataModels) {
if (markerDataModels != null && markerDataModels.size() != 0) {
MarkerDataModel markerDataModel;
for (int i = 0; i < markerDataModels.size(); i++) {
markerDataModel = markerDataModels.get(i);
Marker marker = googleMap.addMarker(new MarkerOptions()
.position(new LatLng(markerDataModel.getLat(), markerDataModel.getLng()))
.title(markerDataModel.getLabel()));
PicassoMarker picassoMarker picassoMarker = new PicassoMarker(marker);
Picasso.
with(activityContext)
.load(markerDataModel.getIcon())
//.memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)
//.networkPolicy(NetworkPolicy.NO_CACHE)
.into(picassoMarker);
}
}
}
}.execute("http://example.com");
【问题讨论】:
-
您能否尝试保持对
PicassoMarker的强引用 -Picasso本身将仅保留WeakReference,因此不会阻止PicassoMarker被垃圾收集。我不确定这是否解释了为什么您第二次获得标记,但请记住这一点 - 可能是第一次 Picasso 太慢,因为它从网络/光盘加载图标(?)但是当图标已经在缓存中时,第二次足够快。 -
@david.mihola,谢谢您的回复!注意,我保持强烈的参考。我试图阻止缓存检查,当从 URL 加载图标时,毕加索也加载了它们,但只是第二次。我对这个问题的解决方案是 Glide。在第一个活动开始后,Glide 会很好地加载图标。
标签: android google-maps android-asynctask google-maps-markers picasso