BitmapFactory.Options返回null:无法从缓存获取Bitmap始终为空
无法从缓存获取Bitmap返回null的排查方案
你的代码逻辑是先从缓存取Bitmap,取不到就解码文件再存入缓存,但缓存始终返回null,大概率是这几个问题导致的:
缓存键不匹配
确认fileName在调用getBitmapFromCache和addBitmapToCache时完全一致:- 检查路径大小写(Android系统区分路径大小写,Windows不区分)
- 路径分隔符是否统一(避免
/和\混用) - 文件名有没有前后空格或特殊字符
BitmapCacheUtil内部实现存在bug
检查你的缓存工具类核心逻辑:addBitmapToCache是否真的把Bitmap和对应的fileName键绑定存储?比如是不是用HashMap时把键值搞反了,或者缓存容器初始化错误getBitmapFromCache是否正确根据fileName查询?比如有没有误判键的存在,或者返回时做了不必要的处理导致返回null- 如果是LruCache这类内存缓存,检查缓存大小是否设置过小,导致刚存入的Bitmap被系统立刻回收
首次解码文件就返回null
如果BitmapFactory.decodeFile(fileName, opt)本身就解码失败返回null,那存入缓存的就是null,后续获取自然也是null:- 打印
new File(fileName).exists()验证文件是否真实存在、路径是否正确 - 检查App是否有读取该文件的权限(比如Android 6.0以上需要动态申请存储权限)
- 确认文件不是损坏的图片,或者格式不被BitmapFactory支持
- 打印
临时排查日志
给代码加日志快速定位问题:public static Bitmap readBitMap(String fileName) { Bitmap bitmapFromCache = BitmapCacheUtil.getInstance().getBitmapFromCache(fileName); Log.d("BitmapCache", "缓存获取结果:" + fileName + " -> " + (bitmapFromCache != null)); if (null != bitmapFromCache) { return bitmapFromCache; } BitmapFactory.Options opt = new BitmapFactory.Options(); opt.inJustDecodeBounds = false; opt.inPreferredConfig = Bitmap.Config.RGB_565; opt.inPurgeable = true; opt.inInputShareable = true; opt.inSampleSize = 1; bitmapFromCache = BitmapFactory.decodeFile(fileName, opt); Log.d("BitmapCache", "文件解码结果:" + fileName + " -> " + (bitmapFromCache != null)); BitmapCacheUtil.getInstance().addBitmapToCache(fileName, bitmapFromCache); // 存入后立刻再取一次验证 Bitmap temp = BitmapCacheUtil.getInstance().getBitmapFromCache(fileName); Log.d("BitmapCache", "存入后再取结果:" + fileName + " -> " + (temp != null)); return bitmapFromCache; }通过日志就能直接看出是缓存存不进去、解码失败还是键不匹配。
内容的提问来源于stack exchange,提问作者Dinuka Shehan
相关产品推荐
相关产品推荐

