【问题标题】:Issues with garbage collection and Picasso垃圾收集和毕加索的问题
【发布时间】:2015-03-26 08:09:40
【问题描述】:

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

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

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

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

[edit] 这是在一堆代码被合并到那个活动之后,所以它可能是一个记忆的东西吗? (现在完成的处理比我没有这个问题时更多)

[编辑 2] 我遇到了与 Glide 完全相同的问题!!可能是垃圾回收?

【问题讨论】:

    标签: java android garbage-collection imageview picasso


    【解决方案1】:

    我不熟悉那个答案,但是当你没有强烈参考时,Target 可能会被 gc'ed。

    这是因为毕加索持有 Target 弱引用实例。

    您应该在 Picasso 之外的某个地方持有 Target 实例。

    检查这个问题:https://github.com/square/picasso/issues/352

    【讨论】:

    • 谢谢,我尝试将回调对象存储在活动的一个字段中(回调和 InfoWindowAdapter 都嵌套在其中),然后将该字段作为参数传递给.into(),但我得到了相同的消息和问题(不确定我是否正确)edit 显然回调仍然是一个强有力的参考
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我犯了同样的错误,这是有效的解决方案:

      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);
      

      【讨论】:

        猜你喜欢
        • 2020-08-31
        • 1970-01-01
        • 1970-01-01
        • 2011-02-23
        • 2011-06-03
        • 1970-01-01
        • 2014-03-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多