为了账号安全,请及时绑定邮箱和手机立即绑定

在第一次加载时未调用的Target对象的onBitmapLoaded

在第一次加载时未调用的Target对象的onBitmapLoaded

在第一次加载时未调用的Target对象的onBitmapLoaded在我的功能:public void getPointMarkerFromUrl(final String url, final OnBitmapDescriptorRetrievedListener listener) {final int maxSize = context.getResources().getDimensionPixelSize(R.dimen.icon_max_size);Target t = new Target() {   @Override   public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {     if (bitmap != null)       listener.bitmapRetrieved(getBitmapDescriptorInCache(url, bitmap));     else       loadDefaultMarker(listener);   }   @Override   public void onBitmapFailed(Drawable errorDrawable) {     loadDefaultMarker(listener);   }   @Override   public void onPrepareLoad(Drawable placeHolderDrawable) {   }};Picasso.with(context)     .load(url)     .resize(maxSize, maxSize)     .into(t);}我第一次加载图片时从不调用onBitmapLoaded()。我已经阅读了一些话题,如https://github.com/square/picasso/issues/39,建议使用fetch(Target t)方法(这似乎是弱引用的问题......),但是这个函数在毕加索的最后一个版本(2.3.2)中没有。我只有一个fetch()方法,但我不能同时使用(mytarget)你能解释一下如何使用fetch()和自定义Target吗?谢谢。Doc:http://square.github.io/picasso/javadoc/com/squareup/picasso/RequestCreator.html#fetch--
查看完整描述

3 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

正如其他受访者(@lukas和@mradzinski)所指出的那样,毕加索只对该Target对象保持弱引用。虽然你可以在你的Target一个类中存储一个强引用,但是如果以任何方式Target引用a ,这仍然会有问题View,因为你也有效地保持对它的强引用View(这是毕加索的事情之一)明确帮助你避免)。

如果您处于这种情况,我建议将标记标记TargetView

final ImageView imageView = ... // The view Picasso is loading an image intofinal Target target = new Target{...};imageView.setTag(target);

这种方法的好处是让毕加索能够为您处理一切。它将管理WeakReference每个视图的对象 - 只要不再需要一个,Target对图像也将被释放的任何处理,所以你不会因长期目标而陷入内存泄漏,但你的目标会持续只要它的观点还活着。


查看完整回答
反对 回复 2019-08-02
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

Picasso没有对Target对象的强引用,因此它被垃圾收集并且不调用onBitmapLoaded。

解决方案很简单,juste强烈引用了Target。

public class MyClass {
   private Target mTarget = new Target() {...};
   public void getPointMarkerFromUrl(final String url, final OnBitmapDescriptorRetrievedListener listener) {
         Picasso.with(context)
         .load(url)
         .resize(maxSize, maxSize)
         .into(mTarget);
   }}


查看完整回答
反对 回复 2019-08-02
?
慕仙森

TA贡献1827条经验 获得超7个赞

如果我有ImageView,我会这么简单:imageView.setTag(target);

我使用下一个解决方案将Bitmaps加载到通知中,所以我只需要位图。

因此,创建Set witch将存储Target对象并在完成加载时将其删除。

final Set<Target> protectedFromGarbageCollectorTargets = new HashSet<>();private void loadBitmap(String url) {
   Target bitmapTarget = new BitmapTarget(nEvent);
   protectedFromGarbageCollectorTargets.add(bitmapTarget);
   Picasso.with(context).load(url).into(bitmapTarget);}class BitmapTarget implements Target {
        @Override
        public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom loadedFrom) {
                    //handle bitmap
                    protectedFromGarbageCollectorTargets.remove(this);
                }
            }
        }
        @Override
        public void onBitmapFailed(Drawable drawable) {
            protectedFromGarbageCollectorTargets.remove(this);
        }
        @Override
        public void onPrepareLoad(Drawable drawable) {
        }
    }


查看完整回答
反对 回复 2019-08-02
  • 3 回答
  • 0 关注
  • 757 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信