从单声道的android上读取本地存储的图像文件

bat*_*tle 0 c# android xamarin.android

在用于Android的单声道中,我有一个应用程序,可以将图像保存到本地存储以进行缓存.当应用程序启动时,它会尝试从缓存中加载图像,然后再尝试从Web加载它们.

我目前很难找到一种从本地存储中读取和加载它们的好方法.

我目前正在使用与此类似的东西:

        List<byte> byteList = new List<byte>();
        using (System.IO.BinaryReader binaryReader = new System.IO.BinaryReader(context.OpenFileInput("filename.jpg")))
        {
            while (binaryReader.BaseStream.IsDataAvailable())
            {
                byteList.Add(binaryReader.ReadByte());
            }
        }
        return byteList.toArray();
Run Code Online (Sandbox Code Playgroud)

OpenFileInput()返回一个不给我一个长度的流,所以我必须一次读取一个字节.它也无法寻求.这似乎导致图像加载速度比它们的速度慢得多.通过比较,从Resrouce.Drawable加载图像几乎是即时的,但是我的方法有一个非常明显的暂停,可能是300毫秒,用于加载8kb文件.这似乎是一项非常明显的任务,但是我已经尝试了许多解决方案并且搜索了很多建议,但无济于事.

我还注意到,当没有在UI线程上运行时,此代码似乎会因EndOfStream异常而崩溃.

任何帮助将非常感激

jon*_*onp 9

你打算怎么做List<byte>?您希望"从缓存中加载图像",但是您没有指定要将其加载到的内容.

如果要将它们加载到Android.Graphics.Bitmap中,可以使用BitmapFactory.DecodeStream(Stream):

Bitmap bitmap = BitmapFactory.DecodeStream(context.OpenFileInput("filename.jpg"));
Run Code Online (Sandbox Code Playgroud)

这将删除List<byte>中间人.

如果你真的需要所有的字节(无论出于何种原因),你可以依赖System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal)Context.FilesDir相同的事实,这context.OpenFileInput()将使用,允许:

byte[] bytes = System.IO.File.ReadAllBytes(
        Path.Combine (
            System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal),
            "filename.jpg"));
Run Code Online (Sandbox Code Playgroud)

但是,如果这是一个真正的缓存,你应该使用Context.CacheDir代替Context.FilesDir,这是Path.GetTempPath回报:

byte[] cachedBytes = System.IO.File.ReadAllBytes(
        Path.Combine(System.IO.Path.GetTempPath(), "filename.jpg"));
Run Code Online (Sandbox Code Playgroud)