Android 毕加索-指示从web加载的位图的回调

Android 毕加索-指示从web加载的位图的回调,android,imageview,picasso,Android,Imageview,Picasso,我想设置从web加载图像时触发的回调。我知道fetch的用法 Picasso.with(getApplicationContext()).load(URL).fetch(new Callback() { @Override public void onSuccess() { imageView.setAlpha(0f); Picasso.with(get

我想设置从web加载图像时触发的回调。我知道fetch的用法

Picasso.with(getApplicationContext()).load(URL).fetch(new Callback() {
                @Override
                public void onSuccess() {
                    imageView.setAlpha(0f);
                    Picasso.with(getApplicationContext()).load(URL).into(imageView);
                    imageView.animate().setDuration(2000).alpha(1f).start();
                }

                @Override
                public void onError() {
                }
            });
但我不使用上层实现。我想得到一个位图,并改变它,然后显示到图像视图

我希望这个目标对我的案子有效。但是onBitmapLoaded不会触发很多次。我不明白为什么

Picasso.with(getApplicationContext()).load(URL).into(new Target() {
                @Override
                public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                    imageView.setImageBitmap(bitmap);
                }

                @Override
                public void onBitmapFailed(Drawable errorDrawable) {
                }

                @Override
                public void onPrepareLoad(Drawable placeHolderDrawable) {
                }
            });

一种可能的解释是,您正在创建的
Target
实例在使用之前会被垃圾收集,因为它们在任何地方都没有被强烈引用。从javadoc:

注意:此方法保留对目标实例的弱引用,并且 如果您不保持对它的强引用,它将被垃圾收集

您可以在
ViewHolder
或视图中保留强引用(这样,仅当视图也被收集时,它才会被收集)

例如(在视图中):


也许用Glide你可以解决你的问题

    Glide.with(this)
        .load(URL)
        .listener(object : RequestListener<Drawable> {
                override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean): Boolean =
                        false

                override fun onResourceReady(resource: Drawable?, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
                    imageView.alpha = 0F
                    imageView.animate().alpha(1F).setDuration(TimeUnit.MILLISECONDS.toMillis(2000)).start()
                    return false
                }

        })
        .into(imageView)
Glide.with(这个)
.load(URL)
.listener(对象:RequestListener{
重写fun onLoadFailed(e:GlideException?,model:Any?,target:target?,isFirstResource:Boolean):布尔=
错误的
覆盖onResourceReady(资源:可绘制?、模型:任意?、目标:目标?、数据源:数据源?、isFirstResource:Boolean):布尔{
imageView.alpha=0F
imageView.animate().alpha(1F).setDuration(TimeUnit.millis.toMillis(2000)).start()
返回错误
}
})
.into(图像视图)

(如果我理解您的正确…

into方法在加载到图像视图之前不会返回位图。如何预处理图像?可能首先要做的是检查解释是否正确,我会更新答案
    Glide.with(this)
        .load(URL)
        .listener(object : RequestListener<Drawable> {
                override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean): Boolean =
                        false

                override fun onResourceReady(resource: Drawable?, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
                    imageView.alpha = 0F
                    imageView.animate().alpha(1F).setDuration(TimeUnit.MILLISECONDS.toMillis(2000)).start()
                    return false
                }

        })
        .into(imageView)