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 , 看来今天要变了^^).

所以我给你的建议是:

  1. 在 Picasso 上使用滑行(在他们的目标上没有这样弱的参考)。
  2. 由于我不得不使用这两个库,所以我最终在处理程序中使用了 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);
            }
        }
    }
});