毕加索图像未在首次运行时加载

时间:2017-03-16 05:34:26

标签: android picasso

我正在使用毕加索从网址加载图片。由于我需要位图进行进一步处理,我使用Target()类来保存位图。但是毕加索没有在第一次运行时加载图像。但是当我去另一个活动并回到毕加索实施的活动时,它会加载。为什么会这样?任何修复?我的代码如下,

 Picasso.with(getActivity()).load(card.getExtras().getImageUrl()).into(new Target() {
                        @Override
                        public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                            SimpleDateFormat formatter = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
                            Date now = new Date();
                            filename ="certificate_"+ formatter.format(now) + ".png";

                            File path=null;
                            if (getActivity().getExternalCacheDir()==null) {

                               path=getActivity().getCacheDir();
                            }
                            if(getActivity().getExternalCacheDir()!=null){
                                path=getActivity().getExternalCacheDir();
                            }
                           File  image=new  File(path+filename);
                            FileOutputStream fileOutPutStream = null;
                            try {
                                fileOutPutStream = new FileOutputStream(image);
                                bitmap.compress(Bitmap.CompressFormat.PNG, 80, fileOutPutStream);

                                fileOutPutStream.flush();
                                fileOutPutStream.close();
                                Log.d("---REACHED","FILE SAVED--------------");
                            } catch (Exception e) {

                                Crashlytics.logException(e);
                            }

6 个答案:

答案 0 :(得分:4)

这是一个众所周知的问题,因为毕加索只保留一周参考:

此问题的解决方案是将目标设置为您要设置的视图组件的tag

所以你的代码看起来像这样:

Target target = new Target() {
                        @Override
                        public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                           .....
// set the tag to the view
holder.imageView.setTag(target);

//set the target to picasso
Picasso.with(getActivity()).load(card.getExtras().getImageUrl()).into(target);

this SO帖子中给出了相同的正确解释!

答案 1 :(得分:0)

您可以使用它来加载图片。

Picasso.with(getActivity())负载(carImageUrl).into(carImg);

其中, carImg是XML中Imageview的id, carImageUrl是一个资源

答案 2 :(得分:0)

尝试我使用的这个功能: 并使用img.setTag(/*some other object than path of file or errId. But don't forget to add it before using this function*/)。如果您不想以相同的方式使用它,请在检查if时删除getTag()条件。

public static void setImage(final Context context, final ImageView img, @DrawableRes final int defId,
                                @DrawableRes final int errId, final File file, Picasso.Priority priority) {
        if (null != img.getTag()) {
            if (null == img.getDrawable() || !(img.getTag() instanceof String && (img.getTag().equals(file.getAbsolutePath())))) {
                try {
                    if (file.exists()) {
                        Picasso.with(context.getApplicationContext())
                                .load(file)
                                .priority(priority)
                                .placeholder(defId)
                                .error(errId)
                                .fit()
                                .centerInside()
                                .tag(context)
                                .noFade()
                                .into(img, new Callback() {
                                    @Override
                                    public void onSuccess() {
                                        img.setTag(file.getAbsolutePath());
                                    }

                                    @Override
                                    public void onError() {
                                        img.setTag(errId);
                                    }
                                });
                    } else {
                        img.setImageResource(defId);
                        img.setTag(defId);
                    }

                } catch (Exception e) {
                    img.setImageResource(defId);
                    img.setTag(defId);
                }
            }
        } else {
            img.setImageResource(defId);
            img.setTag(defId);
        }
    }

答案 3 :(得分:0)

ViewGroup (RelativeLayout, LinearLayout, FrameLayout等的毕加索图像加载

在我的情况下,以下方式工作。

需要HandlerThreadHandler来加载图片。

以下 kotlin 中的示例。您可以根据需要转换为 Java

val handlerThread = HandlerThread("ImageLoader")
handlerThread.start()

val handler = Handler(handlerThread.looper)
handler.post({
    var bitmap: Bitmap? = null
    try {
        bitmap = Picasso.with(this).load(iamgeUrl).get()
    } catch (e: IOException) {
        e.printStackTrace()
    } finally {
        if (bitmap != null) {
            runOnUiThread({
                imageView.background = BitmapDrawable(resources, bitmap)
            })
        }
    }
})

希望这会对你有所帮助。

答案 4 :(得分:0)

您可以尝试将占位符属性添加到毕加索:

Picasso.with(this).load(imageData)
       .placeholder(R.drawable.placeholder)
       .resize(200,200)
       .into(mImageView)

希望对您有所帮助!

答案 5 :(得分:0)

我知道这是一个老问题,但是对于那些想知道的人。问题是由于对目标变量的引用较弱,因此,如果您希望将其作为Class变量来解决问题,则只需全局定义目标即可