【问题标题】:onBitmapLoaded never calledonBitmapLoaded 从未调用过
【发布时间】:2016-02-09 23:38:48
【问题描述】:

我遇到了onBitmapLoaded 的问题。该方法不应该被调用(它在我第二次进入我的视图时被调用)。尽管如此,我还是保留了对我的目标的引用,因为我将它添加到 arraylist

我不明白为什么它不起作用。 有人有想法吗?

public void loadBitmap() {

    if(loadtarget == null) {
        loadtarget = new Target(){

            @Override
            public void onPrepareLoad(Drawable arg0) {
                Log.d("Bitmap","On prepare load");
                targetList.remove(this);
                return;
            }

            @Override
            public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                Log.d("Bitmap","OKAY for :" + filename);
                targetList.remove(this);
                handleLoadedBitmap(bitmap);
            }

            @Override
            public void onBitmapFailed(Drawable errorDrawable) {
                Log.d("Bitmap","Error for :" + filename);
            }
        };
    }
    targetList.add(loadtarget);
    Picasso.with(context).load(imageUrl).into(loadtarget);
}

【问题讨论】:

  • loadtarget 在哪里声明?作为类属性?
  • 此外,您必须覆盖 equals() 和 hashCode() 方法。请参阅 JavaDoc:实现此类的对象必须具有 * {@link Object#equals(Object)} 和 {@link Object#hashCode()} 的有效实现,以便在内部正确存储。
  • 是的,loadtarget 是一个类属性
  • 从我读到的,我以为我只需要重写目标接口的三个方法。

标签: android bitmap picasso


【解决方案1】:

如果 targetList 和 loadtarget 都是局部变量,那么一旦方法完成,它们就会被标记为 GC 收集。 确保 targetList 是一个类变量,使其比方法更有效。

【讨论】:

  • targetList 和 loadTarget 都是类变量
  • 您应该从onPrepareLoad() 中删除:targetList.remove(this); 并将其添加到onBitmapFailed()
  • 我在发布我的问题后注意到了它,所以我删除了它,但它没有改变任何东西。 onBitmapLoad 无论如何都不会被调用。
  • 我说的是onPrepareLoad而不是onBitmapLoad
  • 我明白了,我改变了我的代码。 targetList.remove(this) 已从 onPrepareLoad() 中删除,但没有任何改变。
【解决方案2】:

我找到了一些技巧来解决我的问题。

通过替换: Picasso.with(context).load(imageUrl).into(targetList.get(i));

与:

Picasso.with(context).load(imageUrl).transform(new Transformation() {

            @Override
            public Bitmap transform(Bitmap source) {
                handleLoadedBitmap(source);
                return source;
            }
            @Override
            public String key() {
                return "";
            }
        }).into(imageView); // imageView is a fictive imageView allocated only for this operation

我的代码正在运行。我不确定这是最好的解决方案,但它解决了我的问题。

【讨论】:

    猜你喜欢
    • 2014-11-16
    • 2016-02-08
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 2014-11-23
    • 2017-08-27
    • 2012-08-09
    • 2013-09-04
    相关资源
    最近更新 更多