我读过这个http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html,但现在我正在寻找一种将磁盘缓存实现到我的应用程序的简单方法。 我发现lib http://square.github.io/picasso/但它不起作用。我总是得到一个“NoClassDefFoundError”。你知道一个图书馆,可以很容易地让我缓存下载的位图吗? 谢谢在磁盘上缓存位图Android
回答
关于 “NoClassDefFoundError的”,这可以通过固定的:
- 右键单击您的项目
- 性能
- Java构建路径
- 在 “库” 选项卡 - 添加自己的lib
- 在“订单和导出”选项卡中 - 确保您添加的库已检查
Gloooops,你修好了!非常感谢!该复选框发生了什么变化? –
我很高兴帮助:) 这是我遇到的越来越恼人的错误之一:/有时将lib添加到libs文件夹不会自动将其完全添加到项目的构建过程。 该复选框会手动执行此操作。 – dors
好的!谢谢! –
您可以从网址试试这个代码缓存图像:
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);
如果你有一些问题随时在评论中提问!
谢谢,但这是使用内存缓存权利?我想使用磁盘缓存。 –
“适用于Android Stdio的解决方案”。
lib中,你不得不在 的build.gradle
依赖关系部分添加一个条目
编译毕加索使用 'com.squareup.picasso:毕加索:2.5.2'
“的NoClassDefFoundError” 将还没来的及 现在你可以使用毕加索缓存图像
我刚刚创建了一个新的缓存库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);
}
});
}
- 1. 如何在内存中缓存内存和磁盘缓存中的位图?
- 2. WebClient的缓存驻留在磁盘上的什么位置?
- 3. 浏览器缓存或磁盘缓存?
- 4. android -universal-image-loader-1.8.4 - 缓存在磁盘上
- 5. 将图像缓存到磁盘
- 6. Readyboost v磁盘缓存
- 7. 缓存磁盘操作
- 8. 毕加索磁盘缓存
- 9. NSMutableDictionary和缓存到磁盘
- 10. UIWebview缓存到磁盘
- 11. 缓存AlamofireImage响应磁盘
- 12. 加密磁盘缓存
- 13. 存储在磁盘上的HashMap从磁盘回读非常缓慢
- 14. pread/pwrite,缓冲区和磁盘缓存
- 15. 何时从fresco android中的磁盘中删除图像缓存?
- 16. Android位图缓存
- 17. android位图缓存
- 18. 缓存位图Android
- 19. 缓存位图 - Android
- 20. Android位图缓存
- 21. 毕加索不缓存磁盘上的图像
- 22. 清除缓存后图像不会从磁盘上删除AFNetworking
- 23. 毕加索内存/磁盘缓存
- 24. 磁盘上的PFFile位置
- 25. Android - 从磁盘上传图片
- 26. 为什么Android中的磁盘上的位图大小比内存大?
- 27. 什么时候在iOS上清除磁盘缓存?
- 28. fcntl:打开和关闭磁盘缓存
- 29. 用于维护磁盘缓存的库
- 30. WordPress的w3total缓存:磁盘,Opcache或Memcache
使用通用的图像加载器 – Raghunandan
你可以找到实例http://stackoverflow.com/questions/16789676/caching-images-and-displaying/16978285#16978285 – Raghunandan
谢谢,我我要去读它 –