猿问

在第一次加载时未调用的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--


拉风的咖菲猫
浏览 758回答 3
3回答

慕少森

正如其他受访者(@lukas和@mradzinski)所指出的那样,毕加索只对该Target对象保持弱引用。虽然你可以在你的Target一个类中存储一个强引用,但是如果以任何方式Target引用a ,这仍然会有问题View,因为你也有效地保持对它的强引用View(这是毕加索的事情之一)明确帮助你避免)。如果您处于这种情况,我建议将标记标记Target为View:final ImageView imageView = ... // The view Picasso is loading an image intofinal Target target = new Target{...};imageView.setTag(target);这种方法的好处是让毕加索能够为您处理一切。它将管理WeakReference每个视图的对象 - 只要不再需要一个,Target对图像也将被释放的任何处理,所以你不会因长期目标而陷入内存泄漏,但你的目标会持续只要它的观点还活着。

回首忆惘然

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

慕仙森

如果我有ImageView,我会这么简单:imageView.setTag(target);我使用下一个解决方案将Bitmaps加载到通知中,所以我只需要位图。因此,创建Set witch将存储Target对象并在完成加载时将其删除。final&nbsp;Set<Target>&nbsp;protectedFromGarbageCollectorTargets&nbsp;=&nbsp;new&nbsp;HashSet<>();private&nbsp;void&nbsp;loadBitmap(String&nbsp;url)&nbsp;{ &nbsp;&nbsp;&nbsp;Target&nbsp;bitmapTarget&nbsp;=&nbsp;new&nbsp;BitmapTarget(nEvent); &nbsp;&nbsp;&nbsp;protectedFromGarbageCollectorTargets.add(bitmapTarget); &nbsp;&nbsp;&nbsp;Picasso.with(context).load(url).into(bitmapTarget);}class&nbsp;BitmapTarget&nbsp;implements&nbsp;Target&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;onBitmapLoaded(Bitmap&nbsp;bitmap,&nbsp;Picasso.LoadedFrom&nbsp;loadedFrom)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//handle&nbsp;bitmap &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protectedFromGarbageCollectorTargets.remove(this); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;onBitmapFailed(Drawable&nbsp;drawable)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protectedFromGarbageCollectorTargets.remove(this); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;onPrepareLoad(Drawable&nbsp;drawable)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}
随时随地看视频慕课网APP
我要回答