Я использую Пикассо.
Я хочу кэшировать изображения на диске и использую для этого okhttpdownloader.
Вот что я пытаюсь сделать. Я хочу, чтобы изображение кэшировалось либо на внешней SD-карте, либо в памяти телефона, но не хочу кэшировать изображения в куче памяти из-за ограничений памяти. Поэтому, если изображение загружается в первый раз, оно должно быть кэшировано на диске, и когда в следующий раз будет сделан запрос для того же URL-адреса, оно должно сначала просмотреть диск, кэшировано оно или нет.
Я не могу добиться этого, это мой код.
public class PicassoCache {
/**
 * Static Picasso Instance
 */
private static Picasso picassoInstance = null;
private File cacheDir;
/**
 * PicassoCache Constructor
 *
 * @param context application Context
 */
private PicassoCache (Context context) {
    if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
        cacheDir = context.getExternalCacheDir();
    else
        cacheDir = context.getCacheDir();
    Downloader downloader   = new OkHttpDownloader(cacheDir, Integer.MAX_VALUE);
    Picasso.Builder builder = new Picasso.Builder(context);
    builder.downloader(downloader);
    picassoInstance = builder.build();
}
/**
 * Get Singleton Picasso Instance
 *
 * @param context application Context
 * @return Picasso instance
 */
public static Picasso getPicassoInstance (Context context) {
    if (picassoInstance == null) {
        new PicassoCache(context);
        return picassoInstance;
    }
    return picassoInstance;
}
}
и внутри адаптера у меня есть следующий код
 PicassoCache.getPicassoInstance(context)
                .load(item.imageUrl)
                .memoryPolicy(MemoryPolicy.NO_CACHE)
                .networkPolicy(NetworkPolicy.NO_CACHE)
                .into(holder.itemImage);
 
                                                                     
                                                                    