Java.IO.IOException加载Drawable时发出警告

时间:2012-05-18 10:43:29

标签: android image loading xamarin.android drawable

为什么Android系统会抛出此异常?

05-18 12:33:44.169 W/System.err( 8230): java.io.IOException: Is a directory
05-18 12:33:44.169 W/System.err( 8230):     at org.apache.harmony.luni.platform.OSFileSystem.read(Native Method)
05-18 12:33:44.169 W/System.err( 8230):     at dalvik.system.BlockGuard$WrappedFileSystem.read(BlockGuard.java:165)
05-18 12:33:44.169 W/System.err( 8230):     at java.io.FileInputStream.read(FileInputStream.java:290)
05-18 12:33:44.169 W/System.err( 8230):     at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:166)
05-18 12:33:44.169 W/System.err( 8230):     at java.io.BufferedInputStream.read(BufferedInputStream.java:324)
05-18 12:33:44.169 W/System.err( 8230):     at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
05-18 12:33:44.169 W/System.err( 8230):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:573)
05-18 12:33:44.169 W/System.err( 8230):     at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:384)
05-18 12:33:44.169 W/System.err( 8230):     at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:412)
05-18 12:33:44.169 W/System.err( 8230):     at dalvik.system.NativeStart.run(Native Method)
05-18 12:33:44.169 D/skia    ( 8230): ---- read threw an exception

我正在将图像加载到内存中:

return BitmapFactory.DecodeFile(fullPathToImage);

这不会导致失败的问题,但它确实会导致不必要的加载延迟。

图像存储在Environment.ExternalStorageDirectory.AbsolutePath上。路径是完整路径,包括图像文件名和扩展名。图像确实正确加载,为什么这样做呢?

我看到了这个SO:java.io.IOException: Is a directory Android,但这似乎与可绘制的资源有关,我没有使用它。

1 个答案:

答案 0 :(得分:0)

如果您在检查中包装DecodeFile调用以查看文件系统是否认为它是一个目录,我很想知道您是否仍然收到错误:

File f = new File(fullPathToImage);
if (!f.IsDirectory)
{
    return BitmapFactory.DecodeFile(fullPathToImage);
}
else
{
    Console.WriteLine("This is a directory: " + fullPathToImage);
}

另一个可能有用的想法。如果你正在处理非常大的图像并且你不需要它们是全分辨率的,你可以通过减小它们的大小来提高性能:

BitmapFactory.Options opts = new BitmapFactory.Options();
opts.InSampleSize = 4; //Cut the image size to 1/4 the original
return BitmapFactory.DecodeFile(imgFile, opts);