如何用Picasso异步缓存图像?

时间:2018-02-17 21:59:53

标签: android image caching picasso

在我的应用程序开始时,我有imageLinks列表

 List<String> imageLinks = Arrays.asList("http://example.com/1.png",
    "http://example.com/2.png",
    "http://example.com/3.png"
    ...
    "http://example.com/n.png");

我想下载图像异步,在我的应用程序的下一次运行中没有互联网连接,我想用Picasso显示图像:

mPicasso.load("http://example.com/1.png").into(imageView)

但是当我尝试使用rxJava在后台(io)线程中下载图像时。我想在后台(io)线程中下载它,因为我需要在下载图像时显示ProgressDialog并在完成时转到另一个活动

for (String imageLink:imageLinks )
    mPicasso.load(imageLink).into(new SimpleTarget()
                @Override
                public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                    Log.e(TAG, "onBitmapLoaded: "+imageLink);
                    subscriber.onNext(true);
                    subscriber.onCompleted();
                })

发生错误:

java.lang.IllegalStateException: Method call should happen from the main thread.
    at com.squareup.picasso.Utils.checkMain(Utils.java:136)
    at com.squareup.picasso.RequestCreator.into(RequestCreator.java:496)

我的另一个想法是使用Retrofit下载图像,但如何将下载的图像添加到Picasso磁盘缓存中以便在下次显示它?

3 个答案:

答案 0 :(得分:1)

我想你可以用这个

private void Brick_MouseDown(object sender, MouseEventArgs e)
    {
        isDragging = true;
    } 
    private void Brick_MouseMove(object sender, MouseEventArgs e)
    {
        if (isDragging)
        {
            Brick1.Left = e.X;
            Brick1.Top = e.Y;
        }
    }
    public void Brick_MouseUp(object sender, MouseEventArgs m)
    {
        isDragging = false;
    }

在RxJava异步作业中使用它

答案 1 :(得分:0)

就像你发布的例外消息所说的那样 - 你需要在主线程上提出你的毕加索请求。

不要害怕它不会在您拨打电话的线程上执行实际图像(向下)加载。 这正是为什么加载到Picasso的Target被描述为加载图像的“异步”方式的原因。你在这个问题中使用了“异步”这个词,但我担心你还不完全明白这意味着什么。

答案 2 :(得分:0)

找到解决方案Picasso.fetch(Callback)

就我而言:

 mPicasso.load(imageLink).fetch(new Callback() {
                @Override
                public void onSuccess() {
                    Log.e(TAG, "onBitmapLoaded: " + imageLink);
                    subscriber.onNext(true);
                    subscriber.onCompleted();
                }

                @Override
                public void onError() {
                    Log.e(TAG, "onBitmapFailed: " + imageLink);
                    subscriber.onNext(false);
                    subscriber.onCompleted();
                }
            });