Android 毕加索目标已被垃圾回收
早上好。我有一个带集群管理器的谷歌地图。很简单,我使用群集绘制标记分组或不分组的位置。无论如何,我从群集管理器得到了一个方法回调,它是群集项渲染。在该回调中,我将自定义图像应用于标记:标记中的用户图像。我发现毕加索最适合处理位图加载,同时也让我非常头疼。我使用Android 毕加索目标已被垃圾回收,android,image,loading,Android,Image,Loading,早上好。我有一个带集群管理器的谷歌地图。很简单,我使用群集绘制标记分组或不分组的位置。无论如何,我从群集管理器得到了一个方法回调,它是群集项渲染。在该回调中,我将自定义图像应用于标记:标记中的用户图像。我发现毕加索最适合处理位图加载,同时也让我非常头疼。我使用Target从毕加索开始初始化位图回调:OnPreLoad、OnFail、OnBitmapLoaded。问题是在第一个集群项上呈现未调用的OnBitmapLoaded,通常不会调用,除非第二次触摸它。第一次时,不会发生任何事情,除了OnPr
Target
从毕加索开始初始化位图回调:OnPreLoad、OnFail、OnBitmapLoaded
。问题是在第一个集群项上呈现未调用的OnBitmapLoaded
,通常不会调用,除非第二次触摸它。第一次时,不会发生任何事情,除了OnPreLoad
之外,没有任何回调被触发。通过谷歌搜索,我发现伟大的毕加索对类的引用很弱。我尝试了谷歌的所有例子:使目标引用强大(从方法中获得类的初始化,并在我的类中初始化类,如下所示)
在这一点上,我得到了相同的结果…有时加载位图,有时不加载。大部分不是。。。
无论如何,我尝试将接口类实现到我自己的类中,如下所示:
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;
}
公共类PicassoMarkerView实现com.squareup.picasso.Target{
私有静态最终字符串TAG=“MarkerRender”;
私有位图mMarkerBitmap;
私人群集管理器McClusterManager;
私人市场;
专用标记器;
公共毕加索{
}
@凌驾
公共int hashCode(){
返回mMarker.hashCode();
}
@凌驾
公共布尔等于(对象o){
if(毕加索MarkerView的o实例){
标记器=((PicassoMarkerView)o).mMarker;
返回mMarker.equals(标记);
}否则{
返回false;
}
}
@凌驾
已加载位图(位图位图,Picasso.LoadedFrom){
位图缩放位图=位图。创建缩放位图(位图,
mMarkerBitmap.getWidth()-15,(int)(mMarkerBitmap.getHeight()/1.5-15),
假);
setIcon(BitmapDescriptorFactory.fromBitmap(叠加(mMarkerBitmap,缩放位图,8,7));
Log.d(标记“onBitmapLoaded:”);
}
@凌驾
公共无效onBitmapFailed(Drawable errorDrawable){
Log.d(标记“onBitmapFailed”);
}
@凌驾
准备加载时的公共无效(可提取占位符可提取){
Log.d(标签“onPrepareLoad:”);
}
专用位图覆盖(位图位图位图1、位图位图位图2、int left、int top){
Bitmap res=Bitmap.createBitmap(bitmap1.getWidth(),bitmap1.getHeight(),
bitmap1.getConfig());
画布=新画布(分辨率);
drawBitmap(位图1,新矩阵(),空);
drawBitmap(位图2,左,上,空);
返回res;
}
public void setMarkerBitmap(位图markerBitmap){
this.mMarkerBitmap=markerBitmap;
}
公共无效集合群集管理器(群集管理器群集管理器){
this.mClusterManager=clusterManager;
}
公共无效设置MarkerItem(MarkerItem-MarkerItem){
this.mMarkerItem=markerItem;
}
公共无效设置标记(标记){
this.mMarker=标记;
}
}
不幸的是,这也不起作用…同样的结果…所以请亲爱的朋友们,你能给我一个这样的工作示例吗?就我所能搜索的范围而言,问题主要发生在尝试在内部循环中执行此操作的用户身上,而我的onClusterItemRender
某种循环,比如说,每当用户看到标记时,它都会被触发,所以是的,它被触发了好几次,速度和循环一样快,所以请给我一些想法,帮助我
重要的是,我不需要使用毕加索的方法,如
fetch(),get()
,因为它们不是必需的,也不适合应用程序的用途。我遇到了类似的问题,保留对目标的引用根本没有帮助
我的项目的目的是使用2种不同的图像下载api来显示图像库,并让用户能够选择使用哪种api
除了毕加索,我还使用了Glide,我对结果感到惊讶,Glide的api在各个方面都完美无瑕。毕加索给了我地狱般的打击(那是我第一次使用Glide,到目前为止我通常使用毕加索,似乎今天它要变了)
所以我给你的建议是:
我遇到了类似的问题,持有对目标的引用根本没有帮助 我的项目的目的是使用2种不同的图像下载api来显示图像库,并让用户能够选择使用哪种api 除了毕加索,我还使用了Glide,我对结果感到惊讶,Glide的api在各个方面都完美无瑕。毕加索给了我地狱般的打击(那是我第一次使用Glide,到目前为止我通常使用毕加索,似乎今天它要变了) 所以我给你的建议是:
救了我一天。现在我可以把它和RxJavaSaved结合起来了。现在我可以将其与RxJava结合起来
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;
}
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);
}
}
}
});