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

发布于 2021-01-30 17:07:33

我正在使用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清单文件添加一些磁盘权限?
关注者
0
被浏览
327
1 个回答
  • 面试哥
    面试哥 2021-01-30
    为面试而生,有面试问题,就找面试哥。

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

    首先将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");
                }
            });
        }
    });
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看