限制Square Picasso的缓存大小最大为60MB

时间:2016-07-12 06:56:51

标签: android picasso

我目前正在使用Picasso在多个回收站视图中的应用程序中下载和缓存图像。到目前为止,毕加索已经使用了大约49MB的缓存大小,我担心随着更多图像的出现,这将变得更高。

我正在使用默认的Picasso.with(context)对象。请回答以下问题:

1)有没有办法限制Picasso缓存的大小。 MemoryPolicy和NetworkPolicy设置为NO_CACHE不是一个选项。我需要缓存但达到一定水平(最多60MB)

2)毕加索是否有办法存储调整大小/裁剪的图像,如Glide DiskCacheStrategy.RESULT

3)如果选项是使用OKHTTP,请指导我使用它来限制Picasso的缓存大小的好教程。 (毕加索2.5.2)

4)由于我使用毕加索的Gradle依赖,我如何添加一个清除缓存功能,如下所示:

Clear Cache memory of Picasso

3 个答案:

答案 0 :(得分:3)

请尝试这个,它似乎对我很有用:

我用它作为单身人士。 只需将60放在DISK / CACHE大小参数的位置。

//Singleton Class for Picasso Downloading, Caching and Displaying Images Library
public class PicassoSingleton {

    private static Picasso mInstance;
    private static long mDiskCacheSize = CommonConsts.DISK_CACHE_SIZE * 1024 * 1024; //Disk Cache
    private static int mMemoryCacheSize = CommonConsts.MEMORY_CACHE_SIZE * 1024 * 1024; //Memory Cache
    private static OkHttpClient mOkHttpClient; //OK Http Client for downloading
    private static Cache diskCache;
    private static LruCache lruCache;


    public static Picasso getSharedInstance(Context context) {
        if (mInstance == null && context != null) {
            //Create disk cache folder if does not exist
            File cache = new File(context.getApplicationContext().getCacheDir(), "picasso_cache");
            if (!cache.exists())
                cache.mkdirs();

            diskCache = new Cache(cache, mDiskCacheSize);
            lruCache = new LruCache(mMemoryCacheSize);
            //Create OK Http Client with retry enabled, timeout and disk cache
            mOkHttpClient = new OkHttpClient();
            mOkHttpClient.setConnectTimeout(CommonConsts.SECONDS_TO_OK_HTTP_TIME_OUT, TimeUnit.SECONDS);
            mOkHttpClient.setRetryOnConnectionFailure(true);
            mOkHttpClient.setCache(diskCache);

            //For better performence in Memory use set memoryCache(Cache.NONE) in this builder (If needed)
            mInstance = new Picasso.Builder(context).memoryCache(lruCache).
                            downloader(new OkHttpDownloader(mOkHttpClient)).
                            indicatorsEnabled(CommonConsts.SHOW_PICASSO_INDICATORS).build();

        }
    }
        return mInstance;
}

    public static void updatePicassoInstance() {
        mInstance = null;
    }

    public static void clearCache() {
        if(lruCache != null) {
            lruCache.clear();
        }
        try {
            if(diskCache != null) {
                diskCache.evictAll();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        lruCache = null;
        diskCache = null;
    }
}

答案 1 :(得分:2)

1)是的,轻松:new com.squareup.picasso.LruCache(60 * 1024 * 1024)。 (只需在Picasso实例中使用您的Cache实例,如new Picasso.Builder(application).memoryCache(cache).build()

2)Picasso自动使用resize()和其他方法的参数作为内存缓存的键的一部分。至于磁盘缓存,nope,Picasso不会触及你的磁盘缓存。磁盘缓存是HTTP客户端的责任(如OkHttp)。

3)如果您在讨论磁盘缓存大小:new OkHttpClient.Builder().cache(new Cache(directory, maxSize)).build()。 (现在你有类似new Picasso.Builder(application).memoryCache(cache).downloader(new OkHttp3Downloader(client)).build()

的东西

4)Picasso的Cache界面有一个clear()方法(当然,LruCache实现了它。)

答案 2 :(得分:1)

好的,我在Picasso中做了很多挖掘,而OKHTTP的内部工作是为了找出缓存是如何发生的,政策是什么等。

对于尝试使用最新的毕加索2.5+和Okhttp 3+的人来说,接受的答案将无效! (我不能用最新的:()

查看

1)getSharedInstance不是Thread安全的,使它同步。

2)如果您不是每次都要这样做,请执行Picasso.setSingletonInstance(thecustompicassocreatedbygetsharedinstance)

<强> P.S。在try块中执行此操作,以避免在破坏静态单例未被破坏后非常快速地重新打开活动的非法状态。还要确保在任何Picasso.with(context)调用

之前调用此方法 3)查看代码,我建议人们不要干涉LruCache,除非绝对确定,它很容易导致浪费未使用的RAM或者设置低 - > Outofmemoryexceptions。

4)如果你甚至不这样做,那就没关系了。 Picasso默认尝试从内置的okhttpdownloader创建磁盘缓存。但根据您使用的毕加索版本,这可能会或可能不会起作用。如果它不起作用,它使用默认的java URL下载器,它也会自己进行一些缓存。

5)我认为这样做的唯一主要原因是获得Clear Cache功能。我们都知道毕加索不会轻易放弃,因为它在包装内受到保护。而像我这样的凡人都会使用gradle来包含这些包裹,让我们不知所措。

以下是代码以及我想要的所有选项。这将使用jakewharton的Picasso 2.5.2,Okhttp 3.4.0和OkHttp3Downloader。

package com.example.project.recommendedapp;


import android.content.Context;
import android.util.Log;

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

import java.io.File;
import java.io.IOException;
import java.util.concurrent.TimeUnit;

import okhttp3.Cache;
import okhttp3.OkHttpClient;

//Singleton Class for Picasso Downloading, Caching and Displaying Images Library
public class PicassoSingleton {

private static Picasso mInstance;
private static long mDiskCacheSize = 50*1024*1024; //Disk Cache limit 50mb

//private static int mMemoryCacheSize = 50*1024*1024; //Memory Cache 50mb, not currently using this. Using default implementation

private static OkHttpClient mOkHttp3Client; //OK Http Client for downloading
private static OkHttp3Downloader okHttp3Downloader;
private static Cache diskCache;
private static LruCache lruCache;//not using it currently


public static synchronized Picasso getSharedInstance(Context context)
{
    if(mInstance == null) {
        if (context != null) {
            //Create disk cache folder if does not exist
            File cache = new File(context.getApplicationContext().getCacheDir(), "picasso_cache");
            if (!cache.exists()) {
                cache.mkdirs();
            }

            diskCache = new Cache(cache, mDiskCacheSize);
            //lruCache = new LruCache(mMemoryCacheSize);//not going to be using it, using default memory cache currently
            lruCache = new LruCache(context); // This is the default lrucache for picasso-> calculates and sets memory cache by itself

            //Create OK Http Client with retry enabled, timeout and disk cache
            mOkHttp3Client = new OkHttpClient.Builder().cache(diskCache).connectTimeout(6000, TimeUnit.SECONDS).build();  //100 min cache timeout



            //For better performence in Memory use set memoryCache(Cache.NONE) in this builder (If needed)
            mInstance = new Picasso.Builder(context).memoryCache(lruCache).downloader(new OkHttp3Downloader(mOkHttp3Client)).indicatorsEnabled(true).build();

        }
    }
    return mInstance;
}

public static void deletePicassoInstance()
{
    mInstance = null;
}

public static void clearLRUCache()
{
    if(lruCache!=null) {
        lruCache.clear();
        Log.d("FragmentCreate","clearing LRU cache");
    }

    lruCache = null;

}

public static void clearDiskCache(){
    try {
        if(diskCache!=null) {
            diskCache.evictAll();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

    diskCache = null;

}
}