2015-05-04 93 views
2

我正在使用毕加索。使用磁盘上的毕加索加载图像

我想缓存磁盘上的图像,我正在使用okhttpdownloader。

这是我正在尝试做的操作我希望Image可以缓存在外部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); 

回答

1

尝试删除 .networkPolicy(NetworkPolicy.NO_CACHE) 并添加NO_STORE到memoryPolicy .memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)

+0

这个工作,但我仍看到有被使用的堆内存时我增加向上和向下滚动。 – apk

+0

我不是堆空间消耗方面的专家,但是由于从磁盘到内存的位图加载,临时增加可能是正常行为。据我所知,最大的问题是**只有当和如果**堆大小在中等时间不稳定,也许你有内存泄漏,也许垃圾回收无效释放内存。 – GPack