【问题标题】:Picasso Targets onBitmapLoaded not called in for loopPicasso Targets onBitmapLoaded 未在 for 循环中调用
【发布时间】:2016-11-25 12:52:28
【问题描述】:

下面的代码 sn-p 用于将文件加载到 Bitmap 并将此文件保存在内部目录中(即 PNG,或 JPG 格式)

final List<Target> targets = new ArrayList<Target>();
final List<Target> targetsNormal = new ArrayList<Target>();
for (int j = 0; j < defaultTileImage.size(); j++) {

    final String slangTiles = defaultTileImage.get(j).getPairName() +
            ApplicationConstants.SLANG_TILES;
    final String normalTiles = defaultTileImage.get(j).getPairName() +
            ApplicationConstants.NORMAL_TILES;

    final int k = j;

    Target target = new Target() {
        @Override
        public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
            Log.i("Targets", "Loaded: " + k);
            targets.remove(this);
            saveIntoBitmap(bitmap, slangTiles);
        }
        @Override
        public void onBitmapFailed(Drawable errorDrawable) {
            targets.remove(this);
        }
        @Override
        public void onPrepareLoad(Drawable placeHolderDrawable) {
            Log.i("Targets", "Preparing: " + k);
        }
    };


    Target targetNormal = new Target() {
        @Override
        public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
            Log.i("TargetsNormal", "Loaded: " + k);
            targetsNormal.remove(this);
            saveIntoBitmapSlang(bitmap, normalTiles);
        }
        @Override
        public void onBitmapFailed(Drawable errorDrawable) {
            targetsNormal.remove(this);
        }
        @Override
        public void onPrepareLoad(Drawable placeHolderDrawable) {
            Log.i("TargetsNormal", "Preparing: " + k);
        }
    };
    targetsNormal.add(targetNormal);
    Picasso.with(MainActivity.this)
            .load(defaultTileImage.get(j).getNormalTileImg()) // Start loading the current target
            .resize(100, 100)
            .into(targetNormal);

    targets.add(target);
    Picasso.with(MainActivity.this)
            .load(defaultTileImage.get(j).getSlangTileImg()) // Start loading the current target
            .resize(100, 100)
            .into(target);
}

还访问了此link 并按照使 Target 成为强参考的指南实施。但不幸的是,很多时候 onBitmapLoaded 没有得到任何回调。

非常感谢您帮助解决问题m

【问题讨论】:

  • 老兄,你能发布案例和图片网址的截图吗? (建议使用Glide
  • 截图?其实我只是在做保存这个文件之类的操作。
  • Enable logging 在毕加索中,分析一下。
  • 已取消 [R11]+19s 目标已被垃圾收集。 @R.Zagórski 创建强参考可能会出现问题?
  • 确保 targets 和 targetsNormal 是全局变量而不是本地变量。

标签: android picasso


【解决方案1】:

确保targetstargetsNormal 是全局变量而不是本地变量。

如果它们是局部变量,则可以在离开方法后立即对它们进行垃圾回收。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-16
    • 2016-02-08
    • 1970-01-01
    • 2016-02-09
    • 2020-01-11
    • 2018-04-07
    • 2016-06-08
    • 2012-10-18
    相关资源
    最近更新 更多