【问题标题】:Picasso doesn't download Image for First Time hosted on my company server?Picasso 不下载托管在我公司服务器上的第一次图像?
【发布时间】:2019-01-24 03:42:03
【问题描述】:

第一次加载 ImagePager 时,有时 Picasso 会调用 onError,显示 .error 可绘制对象。如果我按下后退按钮并返回具有 ImagePager 的 Activity,毕加索会正确加载图片。如果 ImagePager 有两张或更多图片并且我在图片之间滑动,则这些图片会在某些时候正确加载而无需退出并重新进入 ImagePager。

它可以正确地从网络上下载其他图像。当我尝试从托管公司服务器下载时出现问题。

我正在使用 Picasso 'com.squareup.picasso:picasso:2.5.0'。

我也提到了下面的问题,但它没有帮助。

First time error loading picture with Picasso

下面是我的 MainActivity.java

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        configureToolbar(R.string.select_task);
        init();
    }

@Override
    protected void init() {
        //TODO: For QA Testing Purpose, Remove after Testing
        mWidthField =findViewById(R.id.edt_txt_1);
        mHeightField =findViewById(R.id.edt_txt_2);
        mImage=findViewById(R.id.image_view_2);
        mImageLoadButton=findViewById(R.id.image_load_button);
        item=new Item();
        item.setPrimaryImageURL("https://cdn.cnn.com/cnnnext/dam/assets/190119161516-01-trump-government-shutdown-0119-exlarge-169.jpg");
        item.setUpc("0001111086751");
        Log.d("ImageManager","Main Activity");
        new ImageManager(getApplicationContext()).downloadImage(item.getPrimaryImageURL(),item.getUpc()+".jpeg",imageDownloadedCallBack);
        mImageLoadButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                loadResizedImage();
            }
        });

    }


//TODO: For QA Testing Purpose, Remove after Testing
    ImageManager.ImageDownloadedCallBack imageDownloadedCallBack=new ImageManager.ImageDownloadedCallBack() {
        @Override
        public void imageDownloadComplete(final Bitmap bitmap, boolean status) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Log.d("ImageManager","Image Download CallBack in Main Activity");
                    mImage.setImageBitmap(bitmap);

                }
            });
        }
    };

下面是我的 ImageManager.java

public class ImageManager {
    private final Context mContext;
    private int mWidth;
    private int mHeight;
    public ImageManager(Context mContext){
        this.mContext=mContext;
    }
    public interface ImageDownloadedCallBack {
        void imageDownloadComplete(Bitmap bitmap,boolean status);
    }

    private Target picassoImageTarget(Context context, final String imageDir, final String imageName,final ImageDownloadedCallBack imageDownloadedCallBack) {
        ContextWrapper cw = new ContextWrapper(context);
        final File directory = cw.getDir(imageDir, Context.MODE_PRIVATE); // path to /data/data/yourapp/app_imageDir
        return new Target() {
            @Override
            public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) {
                Thread thread=new Thread(new Runnable() {
                    @Override
                    public void run() {
                        final File myImageFile = new File(directory, imageName);
                        FileOutputStream fos = null;
                        try {
                            fos = new FileOutputStream(myImageFile);
                            bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
                            Log.d("ImageManager","Image DownLoad CallBack");
                            imageDownloadedCallBack.imageDownloadComplete(bitmap,true);
                        } catch (IOException e) {
                            e.printStackTrace();
                        } finally {
                            try {
                                fos.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                });
                thread.start();
            }

            @Override
            public void onBitmapFailed(Drawable errorDrawable) {
                Log.d("ImageManager","Bitmap Failure");
            }

            @Override
            public void onPrepareLoad(Drawable placeHolderDrawable) {
                if (placeHolderDrawable != null) {}
            }
        };
    }

public void downloadImage(String url, String id,ImageDownloadedCallBack imageDownloadedCallBack){
//        this.imageDownloadedCallBack=imageDownloadedCallBack;
        Log.d("ImageManager","Download Image function");
        Picasso.with(mContext).load(url).into(picassoImageTarget(mContext,"imageDir", id ,imageDownloadedCallBack));

    }
}

任何帮助将不胜感激。

【问题讨论】:

  • 可能是因为图片太大了。
  • 我尝试过使用不同尺寸的不同图像。但无论图像大小如何,我仍然有同样的问题。
  • 还有一个原因是托管图像的 PC 速度很慢或与它的连接速度很慢。

标签: java android multithreading picasso


【解决方案1】:

我从旧帖子中找到了答案,并在 MainActivity 中实现了这段代码。现在它运行良好。

final Target target = new Target{...};
imageView.setTag(target);

上面的代码参考下面的wrb-answer:

wrb-answer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-20
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 2016-03-13
    相关资源
    最近更新 更多