我已阅读此http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html但现在我正在寻找一种在我的应用中实施磁盘缓存的简便方法。 我发现lib http://square.github.io/picasso/但是它不起作用。我总是得到一个“NoClassDefFoundError”。你知道一个库可以轻松地让我缓存下载的位图吗? 谢谢
答案 0 :(得分:1)
关于“NoClassDefFoundError”,可以通过以下方法解决:
答案 1 :(得分:0)
您可以尝试使用此代码来缓存来自网址的图片:
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import android.graphics.Bitmap;
public class MemoryCache {
String TAG = "MemoryCache";
private Map<String, Bitmap> cache=Collections.synchronizedMap(
new LinkedHashMap<String, Bitmap>(10,1.5f,true));//Last argument true for LRU ordering
private long size=0;//current allocated size
private long limit=1000000;//max memory in bytes
public MemoryCache(){
//use 25% of available heap size
setLimit(Runtime.getRuntime().maxMemory()/4);
}
public void setLimit(long new_limit){
limit=new_limit;
}
public Bitmap get(String id){
try{
if(!cache.containsKey(id))
return null;
//NullPointerException sometimes happen here http://code.google.com/p/osmdroid/issues/detail?id=78
return cache.get(id);
}catch(NullPointerException ex){
return null;
}
}
public void put(String id, Bitmap bitmap){
try{
if(cache.containsKey(id))
size-=getSizeInBytes(cache.get(id));
cache.put(id, bitmap);
size+=getSizeInBytes(bitmap);
checkSize();
}catch(Throwable th){
th.printStackTrace();
}
}
private void checkSize() {
if(size>limit){
Iterator<Entry<String, Bitmap>> iter=cache.entrySet().iterator();//least recently accessed item will be the first one iterated
while(iter.hasNext()){
Entry<String, Bitmap> entry=iter.next();
size-=getSizeInBytes(entry.getValue());
iter.remove();
if(size<=limit)
break;
}
}
}
public void clear() {
cache.clear();
}
long getSizeInBytes(Bitmap bitmap) {
if(bitmap==null)
return 0;
return bitmap.getRowBytes() * bitmap.getHeight();
}
}
用法是:
memoryCache.put(photoToLoad.url, bmp);
并得到:
memoryCache.get(url);
如果您有任何问题可以在评论中随意提问!
答案 2 :(得分:0)
&#34; Android Stdio解决方案。&#34;
要使用picasso lib,您必须输入
的build.gradle
依赖项部分添加
compile&#39; com.squareup.picasso:picasso:2.5.2&#39;
&#34; NoClassDefFoundError的&#34;不会来的 现在您可以使用毕加索来缓存图像
答案 3 :(得分:0)
我刚刚创建了一个新的缓存库VIF来满足这个需求:
以下是如何使用它
@Override
public void run() {
appCache = new DiskCache(this, "app_cache", 1024 * 1024 * 20);// 20 MB cache
downloadImage(url);
loadImage(imageView, url);
}
private void downloadImage(String imageUrl) {
URL url = new URL(imageUrl);
URLConnection connection = url.openConnection();
connection.connect();
appCache.put(imageUrl, connection.getInputStream());
}
private void loadImage(final ImageView imageView, String imageUrl) {
appCache.getAsObject(MY_IMAGE, new DiskCache.ParserCallback<Bitmap>() {
@Override
public Bitmap parse(@NonNull File file) throws Exception {
return BitmapFactory.decodeFile(file.getAbsolutePath());
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onResult(@Nullable Bitmap result) {
imageView.setImageBitmap(result);
}
});
}