垃圾收集和毕加索的问题

时间:2015-03-26 08:09:40

标签: java android garbage-collection imageview picasso

我正在尝试在Google Maps Marker的InfoWindow中设置一个ImageView并完全复制this answer中的代码,除了我的InfoWindowAdapter不是一个匿名的内部类(它只是活动的内部类) )。这之前有效,但由于某种原因它已停止工作 - 回调中的onSuccess方法没有被调用,因此InfoWindow仅在第二次打开时显示图像。

查看Picasso的日志我收到的消息类似于Main canceled [R20]+374ms target got garbage collected。我想这可能是因为Callback正在获取gc'd,并尝试将其设置为final,并且还将对象保存在类字段中(这些都不起作用,尽管我可能做错了吗?)

这里可能会发生什么,我该如何解决?在错误消息中是target引用回调,还是它可以引用作为参数传递给Callback的构造函数的标记?

另一个奇怪的事情是,有时在InfoWindow首次打开时图像被正确加载 - 我正在试图找出原因,但基本上我有很多标记以及它们的图像是否在第一次加载时是否正确加载似乎不一致。在首次打开InfoWindow时,有些(大多数)似乎永远无法正确加载。

[edit]这是在一堆代码合并到该活动之后,它可能是一个内存的东西吗? (现在处理的时间比我没有遇到这个问题时更多)

[编辑2]我与Glide有完全相同的问题!!可能是垃圾收集?

3 个答案:

答案 0 :(得分:7)

我对这个答案并不熟悉,但是当你没有强烈提及时,可以Target

这是因为Picasso持有Target实例的弱引用。

你应该在毕加索之外的某个地方举行Target实例。

请检查此问题:https://github.com/square/picasso/issues/352

答案 1 :(得分:2)

解决了这个问题,垃圾收集消息实际上引用了ImageView,而不是Callback对象。确保ImageView对象不被垃圾收集将纠正这种情况(例如,通过将ImageView保存在类中的字段中,甚至是我的类嵌套在其中的活动)

答案 2 :(得分:0)

我在犯同样的错误,这是可行的解决方案:

Error: operator and operand don't agree [tycon mismatch]  
operator domain: char list list  
operand:         char list 
in expression: aL x uncaught exception Error