Picasso Target 已被垃圾回收
Picasso Target has been garbage collected
好 day.I 有一张 google 地图与集群 manager.Simple 一个,我使用集群来绘制分组的标记或者 not.Anyway 我从集群获得了一个方法回调管理器,它是群集项目渲染 one.Inside 我正在将自定义图像应用于 marker.I 内的 marker:The 用户图像的回调发现 Picasso 是处理位图加载的最佳选择,同时得到了我很多 headache.I 正在使用 Picasso 的 Target
class 来启动位图回调:OnPreLoad,OnFail,OnBitmapLoaded
。问题是在第一个集群项目上渲染 onBitmapLoaded
不是被调用并且通常它永远不会被调用,除非它被第二次触摸 time.On 第一次没有任何反应,除了 OnPreLoad
之外没有触发回调并且通过谷歌搜索我发现伟大的毕加索对 class.I 尝试了 google:Making 目标参考强的所有示例(从方法中获取 class 的初始化并在我的 class 中初始化 class,如下所示)
@Override
protected void onClusterItemRendered(MarkerItem clusterItem, Marker marker) {
mMarker = marker;
mMarkerItem = clusterItem;
Picasso.with(mContext).load(clusterItem.getImageUrl()).transform(new CircleTransformation()).into(target);
}
private Target target = new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
Log.d(TAG, "onBitmapLoaded: ");
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
Log.d(TAG, "onBitmapFailed: ");
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
Log.d(TAG, "onPrepareLoad: ");
}
};
@Override
protected void onBeforeClusterItemRendered(MarkerItem item, MarkerOptions markerOptions) {
markerOptions.title(item.getTitle());
markerOptions.icon(item.getIcon());
}
此时我得到相同的结果....有时位图已加载,有时 not.Mostly 未...
无论如何,我已经尝试将接口 class 实现到我自己的 class 如下:
public class PicassoMarkerView implements com.squareup.picasso.Target {
private static final String TAG = "MarkerRender";
private Bitmap mMarkerBitmap;
private ClusterManager<MarkerItem> mClusterManager;
private MarkerItem mMarkerItem;
private Marker mMarker;
public PicassoMarkerView() {
}
@Override
public int hashCode() {
return mMarker.hashCode();
}
@Override
public boolean equals(Object o) {
if (o instanceof PicassoMarkerView) {
Marker marker = ((PicassoMarkerView) o).mMarker;
return mMarker.equals(marker);
} else {
return false;
}
}
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap,
mMarkerBitmap.getWidth() - 15, (int) (mMarkerBitmap.getHeight() / 1.5 - 15),
false);
mMarker.setIcon(BitmapDescriptorFactory.fromBitmap(overlay(mMarkerBitmap, scaledBitmap, 8, 7)));
Log.d(TAG, "onBitmapLoaded: ");
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
Log.d(TAG, "onBitmapFailed: ");
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
Log.d(TAG, "onPrepareLoad: ");
}
private Bitmap overlay(Bitmap bitmap1, Bitmap bitmap2, int left, int top) {
Bitmap res = Bitmap.createBitmap(bitmap1.getWidth(), bitmap1.getHeight(),
bitmap1.getConfig());
Canvas canvas = new Canvas(res);
canvas.drawBitmap(bitmap1, new Matrix(), null);
canvas.drawBitmap(bitmap2, left, top, null);
return res;
}
public void setMarkerBitmap(Bitmap markerBitmap) {
this.mMarkerBitmap = markerBitmap;
}
public void setClusterManager(ClusterManager<MarkerItem> clusterManager) {
this.mClusterManager = clusterManager;
}
public void setMarkerItem(MarkerItem markerItem) {
this.mMarkerItem = markerItem;
}
public void setMarker(Marker marker) {
this.mMarker = marker;
}
}
不幸的是,这也不起作用...同样的结果...所以亲爱的朋友,你能给我一个这样的工作示例吗?据我所知 google,问题主要发生在尝试在循环内执行此操作的用户和我的 onClusterItemRender
某种循环可以说,因为每次标记对用户可见时都会触发它,所以是的,它会被触发几次并且与循环一样快,所以请给我一些想法请帮帮我...
重要的是我不需要像 fetch(),get()
那样使用毕加索的方法,因为它们不是必需的,也不符合应用程序的目的。
我遇到了类似的问题,保持对目标的引用根本没有帮助。
我的项目的目的是使用 2 个不同的图片下载 api 来显示图片库,并让用户能够选择 api 使用哪个。
除了 Picasso,我还使用了 Glide,我对结果感到惊讶,Glide 的 api 在各个方面都完美无缺,而 Picasso 让我很痛苦(那是我第一次使用 Glide,到目前为止我通常使用 Picasso , 看来今天要变了^^).
所以我给你的建议是:
- 在 Picasso 上使用滑行(在他们的目标上没有这样弱的参考)。
- 由于我不得不使用这两个库,所以我最终在处理程序中使用了 get(),不确定它是否对您有帮助,但它解决了我的问题:
handlerThread = new HandlerThread(HANDLER_THREAD_NAME);
handlerThread.start();
Handler handler = new Handler(handlerThread.getLooper());
handler.post(new Runnable() {
@Override
public void run() {
Bitmap bitmap = null;
try {
bitmap = picasso.with(appContext).load(url).get();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (bitmap != null) {
//do whatever you wanna do with the picture.
//for me it was using my own cache
imageCaching.cacheImage(imageId, bitmap);
}
}
}
});
好 day.I 有一张 google 地图与集群 manager.Simple 一个,我使用集群来绘制分组的标记或者 not.Anyway 我从集群获得了一个方法回调管理器,它是群集项目渲染 one.Inside 我正在将自定义图像应用于 marker.I 内的 marker:The 用户图像的回调发现 Picasso 是处理位图加载的最佳选择,同时得到了我很多 headache.I 正在使用 Picasso 的 Target
class 来启动位图回调:OnPreLoad,OnFail,OnBitmapLoaded
。问题是在第一个集群项目上渲染 onBitmapLoaded
不是被调用并且通常它永远不会被调用,除非它被第二次触摸 time.On 第一次没有任何反应,除了 OnPreLoad
之外没有触发回调并且通过谷歌搜索我发现伟大的毕加索对 class.I 尝试了 google:Making 目标参考强的所有示例(从方法中获取 class 的初始化并在我的 class 中初始化 class,如下所示)
@Override
protected void onClusterItemRendered(MarkerItem clusterItem, Marker marker) {
mMarker = marker;
mMarkerItem = clusterItem;
Picasso.with(mContext).load(clusterItem.getImageUrl()).transform(new CircleTransformation()).into(target);
}
private Target target = new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
Log.d(TAG, "onBitmapLoaded: ");
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
Log.d(TAG, "onBitmapFailed: ");
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
Log.d(TAG, "onPrepareLoad: ");
}
};
@Override
protected void onBeforeClusterItemRendered(MarkerItem item, MarkerOptions markerOptions) {
markerOptions.title(item.getTitle());
markerOptions.icon(item.getIcon());
}
此时我得到相同的结果....有时位图已加载,有时 not.Mostly 未... 无论如何,我已经尝试将接口 class 实现到我自己的 class 如下:
public class PicassoMarkerView implements com.squareup.picasso.Target {
private static final String TAG = "MarkerRender";
private Bitmap mMarkerBitmap;
private ClusterManager<MarkerItem> mClusterManager;
private MarkerItem mMarkerItem;
private Marker mMarker;
public PicassoMarkerView() {
}
@Override
public int hashCode() {
return mMarker.hashCode();
}
@Override
public boolean equals(Object o) {
if (o instanceof PicassoMarkerView) {
Marker marker = ((PicassoMarkerView) o).mMarker;
return mMarker.equals(marker);
} else {
return false;
}
}
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap,
mMarkerBitmap.getWidth() - 15, (int) (mMarkerBitmap.getHeight() / 1.5 - 15),
false);
mMarker.setIcon(BitmapDescriptorFactory.fromBitmap(overlay(mMarkerBitmap, scaledBitmap, 8, 7)));
Log.d(TAG, "onBitmapLoaded: ");
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
Log.d(TAG, "onBitmapFailed: ");
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
Log.d(TAG, "onPrepareLoad: ");
}
private Bitmap overlay(Bitmap bitmap1, Bitmap bitmap2, int left, int top) {
Bitmap res = Bitmap.createBitmap(bitmap1.getWidth(), bitmap1.getHeight(),
bitmap1.getConfig());
Canvas canvas = new Canvas(res);
canvas.drawBitmap(bitmap1, new Matrix(), null);
canvas.drawBitmap(bitmap2, left, top, null);
return res;
}
public void setMarkerBitmap(Bitmap markerBitmap) {
this.mMarkerBitmap = markerBitmap;
}
public void setClusterManager(ClusterManager<MarkerItem> clusterManager) {
this.mClusterManager = clusterManager;
}
public void setMarkerItem(MarkerItem markerItem) {
this.mMarkerItem = markerItem;
}
public void setMarker(Marker marker) {
this.mMarker = marker;
}
}
不幸的是,这也不起作用...同样的结果...所以亲爱的朋友,你能给我一个这样的工作示例吗?据我所知 google,问题主要发生在尝试在循环内执行此操作的用户和我的 onClusterItemRender
某种循环可以说,因为每次标记对用户可见时都会触发它,所以是的,它会被触发几次并且与循环一样快,所以请给我一些想法请帮帮我...
重要的是我不需要像 fetch(),get()
那样使用毕加索的方法,因为它们不是必需的,也不符合应用程序的目的。
我遇到了类似的问题,保持对目标的引用根本没有帮助。
我的项目的目的是使用 2 个不同的图片下载 api 来显示图片库,并让用户能够选择 api 使用哪个。
除了 Picasso,我还使用了 Glide,我对结果感到惊讶,Glide 的 api 在各个方面都完美无缺,而 Picasso 让我很痛苦(那是我第一次使用 Glide,到目前为止我通常使用 Picasso , 看来今天要变了^^).
所以我给你的建议是:
- 在 Picasso 上使用滑行(在他们的目标上没有这样弱的参考)。
- 由于我不得不使用这两个库,所以我最终在处理程序中使用了 get(),不确定它是否对您有帮助,但它解决了我的问题:
handlerThread = new HandlerThread(HANDLER_THREAD_NAME);
handlerThread.start();
Handler handler = new Handler(handlerThread.getLooper());
handler.post(new Runnable() {
@Override
public void run() {
Bitmap bitmap = null;
try {
bitmap = picasso.with(appContext).load(url).get();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (bitmap != null) {
//do whatever you wanna do with the picture.
//for me it was using my own cache
imageCaching.cacheImage(imageId, bitmap);
}
}
}
});