Java 垃圾收集和毕加索的问题
我试图在Google Maps Marker的InfoWindow中设置ImageView,并从中复制了非常精确的代码,只是我的InfoWindowAdapter不是匿名内部类(它只是活动的内部类)。这以前是有效的,但由于某种原因它已经停止工作-回调中的onSuccess方法没有被调用,因此InfoWindow只在第二次打开时显示图像 查看毕加索的日志,我得到的消息类似于Java 垃圾收集和毕加索的问题,java,android,garbage-collection,imageview,picasso,Java,Android,Garbage Collection,Imageview,Picasso,我试图在Google Maps Marker的InfoWindow中设置ImageView,并从中复制了非常精确的代码,只是我的InfoWindowAdapter不是匿名内部类(它只是活动的内部类)。这以前是有效的,但由于某种原因它已经停止工作-回调中的onSuccess方法没有被调用,因此InfoWindow只在第二次打开时显示图像 查看毕加索的日志,我得到的消息类似于Main cancelled[R20]+374ms target被垃圾回收。我想这可能是因为回调得到了gc'd,并尝试将其设置
Main cancelled[R20]+374ms target被垃圾回收。我想这可能是因为回调得到了gc'd,并尝试将其设置为final,还将对象保存在一个类字段中(这两个都不起作用,尽管可能我做得不对?)
这里可能会发生什么,我该如何解决?错误消息中的target
是指回调,还是指作为参数传递给回调构造函数的标记
另一件奇怪的事情是,有时候当InfoWindow第一次打开时,图像被正确加载-我试图找出原因,但基本上我有很多标记,它们的图像在第一次加载时是否正确似乎不一致。当InfoWindow第一次打开时,有些(大多数)似乎从未正确加载
[编辑]这是在一堆代码被合并到该活动中之后,所以它可能是一个内存问题吗?(与我没有遇到此问题时相比,现在完成了更多的处理)
[编辑2]我也有同样的问题!!可能是垃圾收集?我不太熟悉这个答案,但是如果您没有很强的引用,Target
可能会被gc'ed
这是因为毕加索持有的Target
实例引用较弱
您应该在毕加索之外的某个地方持有Target
实例
检查此问题:解决了它,垃圾收集消息实际上引用的是ImageView,而不是回调对象。确保ImageView对象未被垃圾收集将纠正这一问题(例如,通过将ImageView保存在类中的字段中,甚至保存我的类嵌套在其中的活动)我也犯了同样的错误,下面是有效的解决方案:
My previous code :
picasso.load(url).into(new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
}
@Override
public void onBitmapFailed(Exception e, Drawable errorDrawable) {
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
});
After this I just created a new variable for Target object :
final Target target=new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
imageView.setBackground(new BitmapDrawable(mContext.getResources(), bitmap));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
}
@Override
public void onBitmapFailed(Exception e, Drawable errorDrawable) {
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
};
then I used the target object later in my code :
picasso.load(url).into( target);
谢谢,我尝试将回调对象存储在活动的一个字段中(回调和InfoWindowAdapter都嵌套在其中),然后将该字段作为参数传递给.into()
,但我收到了相同的消息和问题(不确定是否正确),显然回调始终作为强引用保留