2012-08-14 106 views
3

我实现了一个文件缓存来为长网格视图加载小图像。滚动一段时间后,我收到很多libcore.io.ErrnoException: open failed: EMFILE (Too many open files)android EMFILE(太多打开的文件)

我该如何避免这种情况?这是代码读取一个位图:

File fullCacheDir = new File(Environment.getExternalStorageDirectory().toString(), cacheDir); 
File file = new File(fullCacheDir.toString(), fileName); 

if (!file.exists()) { 
    return null; 
} 

Bitmap bm = BitmapFactory.decodeFile(file.toString()); 

这是为了保存一个位图:

FileOutputStream outputStream = new FileOutputStream(fileUri); 
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream); 
outputStream.flush(); 
outputStream.close(); 

回答

6

任何机会,你的亲密()没有被调用达因异常?我通常这样编码:

try { 
    new FileOutputStream(fileUri); 
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream); 
    outputStream.flush(); 
} finally { 
    try { 
    outputStream.close(); 
    } catch (Exception ignored) { 
    // ignore exceptions generated by close() 
    } 
} 

我看不出任何明显错误的第一个代码片段。

+0

只是一个更新:Apache Commons有一个[closeQuietly()](https://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/IOUtils.html#closeQuietly(java .io.Closeable))将关闭Closeable并吞下异常的实用程序。我觉得这很有用,即使Apache Commons不可用时,我也会[自己动手](http://www.efalk.org/Docs/Java/techniques.html#Close_Quietly) – 2016-04-05 22:42:06