Picasso首先不在for循环中调用onBitmapLoaded

时间:2015-11-04 09:55:28

标签: android picasso

我有问题,让位图使用Picasso for for循环。

首次运行中未调用onBitmapLoaded。

第二次运行它调用了

<input  class="textbox" type="text" name="name" id="name" placeholder="test" required/>

日志

for (int i = 0; i < 3; i++) { 
            final int k=i;
            Picasso.with(this)
                    .load(ListA.get(i).getImage()) //image
                    .resize(100, 100)
                    .transform(new ImageTrans_CircleTransform())
                    .into(new Target() {
                        @Override
                        public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {                         
                            Log.i("load", "Ok " + k);   
                           //use bitmap for add marker to map                
                        }

                        @Override
                        public void onBitmapFailed(Drawable errorDrawable) {
                        }

                        @Override
                        public void onPrepareLoad(Drawable placeHolderDrawable) {
                            Log.i("load", "first " + k);
                        }
                    });  
        }

我使用毕加索从列表图像中获取位图。

我需要位图而非imageview。

谢谢。 :d

1 个答案:

答案 0 :(得分:22)

使用毕加索目标的一个常见问题是人们不会强烈提及它们。这会导致目标随机工作,因为有时它们会在完成之前由GC收集,有时它们会活得足够长,以便调用回调。

您需要做的是将这些回调存储在某个地方,直到完成为止。这是一个例子:

final List<Target> targets = new ArrayList<Target>();
for (int i = 0; i < 3; i++) { 
    final int k=i;
    Target target = new Target() {

        @Override
        public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {                         
            Log.i("Targets", "Loaded: " + k);   
            targets.remove(this);                
        }

        @Override
        public void onBitmapFailed(Drawable errorDrawable) {
            targets.remove(this);
        }

        @Override
        public void onPrepareLoad(Drawable placeHolderDrawable) {
            Log.i("Targets", "Preparing: " + k);
        }
    }
    targets.add(target);
    Picasso.with(this)
        .load(ListA.get(i).getImage()) // Start loading the current target
        .resize(100, 100)
        .into(target);  
}

为了确保列表不会得到GC,请将targets设为全局变量。