【问题标题】:Caching bitmaps on disk Android在磁盘 Android 上缓存位图
【发布时间】:2013-07-04 05:21:23
【问题描述】:

我已阅读此http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html,但现在我正在寻找一种在我的应用程序中实现磁盘缓存的简单方法。 我发现 lib http://square.github.io/picasso/ 但它不起作用。我总是收到“NoClassDefFoundError”。您知道一个可以轻松让我缓存下载的位图的库吗? 谢谢

【问题讨论】:

标签: android caching bitmap


【解决方案1】:

关于“NoClassDefFoundError”,可以通过以下方式修复:

  • 右键单击您的项目
  • 属性
  • Java 构建路径
  • 在“库”选项卡中 - 添加您的库
  • 在“订购和导出”选项卡中 - 确保选中您添加的库

【讨论】:

  • 咕噜咕噜,你修好了!太感谢了!复选框有什么变化?
  • 我很高兴有帮助 :) 这是我遇到的更烦人的错误之一:/ 有时将 lib 添加到 libs 文件夹不会自动将其完全添加到项目的构建过程中。该复选框手动执行此操作。
【解决方案2】:

您可以尝试使用此代码从 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);

如果您有任何问题,请随时在评论中提问!

【讨论】:

  • 谢谢,但这是使用内存缓存对吗?我想使用磁盘缓存。
【解决方案3】:

“android Stdio 的解决方案。”

要使用 picasso lib,您必须在 构建.gradle
依赖部分添加

编译'com.squareup.picasso:picasso:2.5.2'

"NoClassDefFoundError" 不会来 现在你可以使用 picasso 来缓存图片了

【讨论】:

    【解决方案4】:

    我刚刚创建了一个新的缓存库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);
                }
            });
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-12
      • 1970-01-01
      • 2013-12-26
      • 2016-12-25
      • 1970-01-01
      • 2016-06-18
      • 2016-01-29
      • 1970-01-01
      相关资源
      最近更新 更多