【问题标题】:Picasso first run not call onBitmapLoaded in for loopPicasso 第一次运行在 for 循环中不调用 onBitmapLoaded
【发布时间】:2015-11-04 09:55:28
【问题描述】:

我在获取位图时遇到问题,在 for 循环中使用 Picasso。

首次运行时不会调用 onBitmapLoaded。

第二次运行它调用

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

日志

11-04 16:42:22.222  11677-11677/com.tenten I/load﹕ first___0 
11-04 16:42:22.222  11677-11677/com.tenten I/load﹕ first___1 
11-04 16:42:22.232  11677-11677/com.tenten I/load﹕ first___2 

我使用 picasso 从列表图像中获取位图。

我需要位图而不是图像视图。

谢谢。 :D

【问题讨论】:

    标签: android picasso


    【解决方案1】:

    使用毕加索的目标的一个常见问题是人们不会强烈引用它们。这会导致目标随机工作,因为有时它们会在完成之前被 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 设为全局变量。

    【讨论】:

    • 我正在寻找一种解决方案,以便等待所有目标加载位图。在加载完所有内容后,我需要它来为对象充气。你有什么想法吗?
    • 图片加载完成后调用同步方法。计算加载的图像。如果count = total,则加载所有。如果您需要进一步的帮助,请在 SO 上提出一个新问题。
    • @DanielZolnai stackoverflow.com/q/40805544/1339473 按照您的实施指南保存图像,但目标不会多次获得回调。你能帮我解决这个问题吗?
    • 在这上面浪费了一整天;(
    猜你喜欢
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    • 2016-02-08
    • 2023-01-04
    • 2019-12-19
    相关资源
    最近更新 更多