我已经阅读了这个http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html但现在我正在寻找一种在我的应用程序中实现磁盘缓存的简单方法。我发现 lib http://square.github.io/picasso/但它不起作用。我总是收到“NoClassDefFoundError”。您知道一个可以轻松让我缓存下载的位图的库吗?谢谢
问问题
4438 次
4 回答
1
关于“NoClassDefFoundError”,可以通过以下方式解决:
- 右键单击您的项目
- 特性
- Java 构建路径
- 在“库”选项卡中 - 添加您的库
- 在“订购和导出”选项卡中 - 确保选中您添加的库
于 2013-07-04T05:49:26.517 回答
0
您可以尝试使用此代码从 url 缓存图像:
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);
如果您有任何问题,请随时在评论中提问!
于 2013-07-04T05:29:45.070 回答
0
“Android Stdio 的解决方案。”
要使用 picasso lib,您必须在 build.gradle
依赖项部分添加一个条目
编译'com.squareup.picasso:picasso:2.5.2'
“NoClassDefFoundError”不会出现,现在您可以使用毕加索缓存图像
于 2015-08-13T17:01:14.983 回答
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);
}
});
}
于 2017-10-19T11:03:37.713 回答