Picasso Target已被垃圾收集

VA *_*ent 1 android image loading

美好的一天.我有一个带有集群管理器的谷歌地图.简单的一个,我使用集群绘制分组或不分组的标记.无论如何,我从集群管理器获得了一个方法回调,它是集群项目渲染一个.在我应用的回调中自定义图像到标记:标记内的用户图像.我发现Picasso是最好的处理位图加载,同时让我头疼.我正在使用TargetPicasso的类来启动位图回调:OnPreLoad,OnFail,OnBitmapLoaded.问题是在第一个集群项目上渲染onBitmapLoaded未调用,一般情况下它永远不会被调用,除非它第二次被触摸.第一次没有任何反应,除了OnPreLoad谷歌搜索没有触发回调我发现伟大的毕加索对班级缺乏参考我尝试了谷歌的所有例子:使目标引用变得强大(从方法中获取类的初始化,并在我的类中初始化类,如下所示)

    @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());
}
Run Code Online (Sandbox Code Playgroud)

在这一点上我得到相同的结果....有时位图加载,有时不加.大多数没有...无论如何,我已经尝试将接口类实现到我自己的类,如下所示:

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;
}
Run Code Online (Sandbox Code Playgroud)

}

不幸的是,这也不起作用......同样的结果......所以请亲爱的朋友们,你能给我一个这方面的工作实例吗?据我所知谷歌,问题主要发生在尝试在循环内部进行此操作的用户身上我的onClusterItemRender某种循环可以说,因为它是每次标记对用户可见时触发的,所以是的,它被触发了几次并且和循环一样快,所以请给我一些想法并帮助我...

重要的是,我不需要使用毕加索的方法,fetch(),get()因为它们不是必需的,也不符合应用程序的目的.

Roe*_*oee 5

我遇到了类似的问题,持有对目标的参考根本没有帮助.

我的项目的目的是使用2个不同的图像下载api来显示图像库,并让用户能够选择使用哪个API.

在毕加索旁边,我使用了格莱德,我对结果感到惊讶,格莱德的api在毕加索给我的地狱的每一个方面都完美无缺(这是我第一次使用格莱德,我到目前为止通常使用毕加索,看起来今天它会改变^^ ).

所以我给你的建议是:

  1. 使用滑翔比毕加索(他们的目标没有这样弱的参考).
  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);
            }
        }
    }
});
Run Code Online (Sandbox Code Playgroud)