2013-07-04 82 views
0

我读过这个http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html,但现在我正在寻找一种将磁盘缓存实现到我的应用程序的简单方法。 我发现lib http://square.github.io/picasso/但它不起作用。我总是得到一个“NoClassDefFoundError”。你知道一个图书馆,可以很容易地让我缓存下载的位图吗? 谢谢在磁盘上缓存位图Android

+1

使用通用的图像加载器 – Raghunandan

+0

你可以找到实例http://stackoverflow.com/questions/16789676/caching-images-and-displaying/16978285#16978285 – Raghunandan

+0

谢谢,我我要去读它 –

回答

1

关于 “NoClassDefFoundError的”,这可以通过固定的:

  • 右键单击您的项目
  • 性能
  • Java构建路径
  • 在 “库” 选项卡 - 添加自己的lib
  • 在“订单和导出”选项卡中 - 确保您添加的库已检查
+0

Gloooops,你修好了!非常感谢!该复选框发生了什么变化? –

+1

我很高兴帮助:) 这是我遇到的越来越恼人的错误之一:/有时将lib添加到libs文件夹不会自动将其完全添加到项目的构建过程。 该复选框会手动执行此操作。 – dors

+0

好的!谢谢! –

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); 

如果你有一些问题随时在评论中提问!

+1

谢谢,但这是使用内存缓存权利?我想使用磁盘缓存。 –

0

“适用于Android Stdio的解决方案”。

lib中,你不得不在 的build.gradle
依赖关系部分添加一个条目

编译毕加索使用 'com.squareup.picasso:毕加索:2.5.2'

“的NoClassDefFoundError” 将还没来的及 现在你可以使用毕加索缓存图像

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); 
      } 
     }); 
    }