tangguo

如何在毕加索中使用磁盘缓存?

android

我正在使用Picasso在我的android应用中显示图像:

/**
* load image.This is within a activity so this context is activity
*/
public void loadImage (){
    Picasso picasso = Picasso.with(this); 
    picasso.setDebugging(true);
    picasso.load(quiz.getImageUrl()).into(quizImage);
}

我已启用调试,并且始终显示红色和绿色。但是从不显示黄色

现在,如果我下次加载同一张图片,并且互联网不可用,则无法加载图片。

问题:

  1. 它没有本地磁盘缓存吗?
  2. 我如何启用磁盘缓存,因为我将多次使用相同的映像。
  3. 我是否需要向Android清单文件添加一些磁盘权限?

阅读 360

收藏
2020-10-22

共1个答案

小编典典

这就是我所做的。效果很好。

首先将OkHttp添加到app模块的gradle构建文件中:

compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.squareup.okhttp3:okhttp:3.10.0'
compile 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.1.0'

然后进行课堂扩展 Application

import android.app.Application;

import com.jakewharton.picasso.OkHttp3Downloader;
import com.squareup.picasso.Picasso;

public class Global extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        Picasso.Builder builder = new Picasso.Builder(this);
        builder.downloader(new OkHttp3Downloader(this,Integer.MAX_VALUE));
        Picasso built = builder.build();
        built.setIndicatorsEnabled(true);
        built.setLoggingEnabled(true);
        Picasso.setSingletonInstance(built);

    }
}

如下所示将其添加到清单文件中:

<application
        android:name=".Global"
        .. >

</application>

现在,像往常一样使用毕加索。没有变化。

编辑:

如果只想使用缓存的图像。这样调用库。我注意到,如果不添加networkPolicy,即使已缓存图像也不会在完全脱机的开始中显示。下面的代码解决了这个问题。

Picasso.with(this)
            .load(url)
            .networkPolicy(NetworkPolicy.OFFLINE)
            .into(imageView);

编辑#2

上面的代码的问题是,如果您清除缓存,毕加索将继续在缓存中脱机寻找它并失败,下面的代码示例将查看本地缓存,如果找不到离线,它将联机并补充缓存。

Picasso.with(getActivity())
.load(imageUrl)
.networkPolicy(NetworkPolicy.OFFLINE)
.into(imageView, new Callback() {
    @Override
    public void onSuccess() {

    }

    @Override
    public void onError() {
        //Try again online if cache failed
        Picasso.with(getActivity())
                .load(posts.get(position).getImageUrl())
                .error(R.drawable.header)
                .into(imageView, new Callback() {
            @Override
            public void onSuccess() {

            }

            @Override
            public void onError() {
                Log.v("Picasso","Could not fetch image");
            }
        });
    }
});
2020-10-22