android - picasso 目标 onBitmapLoaded 未在 for 循环中调用

标签 android picasso

下面的代码 fragment 用于将文件加载到位图中并将此文件保存在内部目录中(即 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

最佳答案

确保 targetstargetsNormal 是全局变量而不是局部变量。

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

关于android - picasso 目标 onBitmapLoaded 未在 for 循环中调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40805544/

相关文章:

android - NavigationView 中的彩色图标

android - Dot42 - 如何从资源中填充首选项 fragment ?

android - 我想在 Android 中获取最后插入的记录 id

java - RecyclerView 仅在滚动时加载图像

android - 如何设置 Picasso 占位符 scaleType?

android - picasso 下载随机图像

java - Android 如何在特定时间收到通知

android - Android涂抹布局

android - Picasso .fit().centerCrop() 不适用于 WRAP_CONTENT

android - OutOfMemory 异常 - 对于 adapter.notifiyDataSetChanged() 在使用 picasso 加载图像时