首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在毕加索中使用磁盘缓存?

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

Stack Overflow用户
提问于 2014-06-01 18:19:55
回答 9查看 115.9K关注 0票数 126

我正在使用毕加索在我的android应用程序中显示图像:

代码语言:javascript
复制
/**
* 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);
}

我启用了调试,它总是显示红色和绿色,.But从不显示黄色

现在,如果我下一次加载相同的图像,并且互联网不可用,则图像不会被加载。

问题:

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

回答 9

Stack Overflow用户

发布于 2015-06-07 03:56:43

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

首先,将OkHttp添加到应用程序模块的gradle build文件中:

代码语言:javascript
复制
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的类

代码语言:javascript
复制
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);

    }
}

将其添加到Manifest文件中,如下所示:

代码语言:javascript
复制
<application
        android:name=".Global"
        .. >

</application>

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

编辑:

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

代码语言:javascript
复制
Picasso.with(this)
            .load(url)
            .networkPolicy(NetworkPolicy.OFFLINE)
            .into(imageView);

编辑#2

上面代码的问题是,如果清除缓存,Picasso将继续在缓存中脱机查找它并失败,下面的代码示例查看本地缓存,如果没有找到脱机缓存,它将联机并补充缓存。

代码语言:javascript
复制
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");
            }
        });
    }
});
票数 240
EN

Stack Overflow用户

发布于 2014-12-11 19:25:42

1)第一个问题的答案:根据Picasso Doc for With() method

从with()返回的全局默认毕加索实例会自动使用适用于大多数实现的默认值进行初始化。

  • LRU内存缓存为15%,可用的应用程序内存为
  • 磁盘缓存的2%,存储空间高达50MB,但不低于5MB。

全局默认毕加索的 Disk Cache操作仅在14+接口上可用

2)第二个问题的答案:Picasso使用HTTP客户端请求Disk Cache操作,这样您就可以使用<>d23http request header >创建自己的http request header Cache-Control属性,并使用

1] HttpResponseCache (注:仅适用于13+接口)

2] OkHttpClient (适用于所有API)

使用OkHttpClient创建自己的静态毕加索类的示例

  • 首先创建一个新类来获取您自己的单例picasso对象

导入android.content.Context;导入com.squareup.picasso.Downloader;导入com.squareup.picasso.OkHttpDownloader;导入com.squareup.picasso.Picasso;公有类PicassoCache { /** *静态毕加索实例*/私有静态毕加索picassoInstance = null;/** * PicassoCache构造函数** @param context应用上下文*/私有PicassoCache (Context context) { Downloader downloader =新OkHttpDownloader( Context,Integer.MAX_VALUE);Picasso.Builder builder =新Picasso.Builder(上下文);builder.downloader(下载器);picassoInstance = builder.build();} /** *获取单例毕加索实例**@参数上下文应用上下文*@返回毕加索实例*/公共静态毕加索getPicassoInstance (上下文上下文){ if (picassoInstance == null) {新PicassoCache(上下文);Picasso.With() picassoInstance;} return picassoInstance;}}

  • 使用您自己的单例picasso对象而不是return

PicassoCache.getPicassoInstance(getContext()).load(imagePath).into(imageView)

3)对第三个问题的回答:磁盘缓存操作不需要任何磁盘权限

参考Github issue about disk cache@jake-wharton -> Question1Question2回答了两个问题

票数 46
EN

Stack Overflow用户

发布于 2015-10-21 01:10:20

对于缓存,我将使用OkHttp 拦截器来控制缓存策略。查看包含在OkHttp库中的这个示例。

RewriteResponseCacheControl.java

以下是我对毕加索的用法-

代码语言:javascript
复制
OkHttpClient okHttpClient = new OkHttpClient();
    okHttpClient.networkInterceptors().add(new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Response originalResponse = chain.proceed(chain.request());
            return originalResponse.newBuilder().header("Cache-Control", "max-age=" + (60 * 60 * 24 * 365)).build();
        }
    });

    okHttpClient.setCache(new Cache(mainActivity.getCacheDir(), Integer.MAX_VALUE));
    OkHttpDownloader okHttpDownloader = new OkHttpDownloader(okHttpClient);
    Picasso picasso = new Picasso.Builder(mainActivity).downloader(okHttpDownloader).build();
    picasso.load(imageURL).into(viewHolder.image);
票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23978828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档