C# 在mono for android上从本地存储读取图像文件
在mono for android中,我有一个将图像保存到本地存储的应用程序,用于缓存。当应用程序启动时,它会尝试从缓存加载图像,然后再尝试从web加载图像 我目前很难找到从本地存储读取和加载它们的好方法 我目前正在使用与此类似的东西:C# 在mono for android上从本地存储读取图像文件,c#,android,xamarin.android,C#,Android,Xamarin.android,在mono for android中,我有一个将图像保存到本地存储的应用程序,用于缓存。当应用程序启动时,它会尝试从缓存加载图像,然后再尝试从web加载图像 我目前很难找到从本地存储读取和加载它们的好方法 我目前正在使用与此类似的东西: List<byte> byteList = new List<byte>(); using (System.IO.BinaryReader binaryReader = new System.IO.Bina
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();
List byteList=new List();
使用(System.IO.BinaryReader BinaryReader=new System.IO.BinaryReader(context.OpenFileInput(“filename.jpg”))
{
while(binaryReader.BaseStream.IsDataAvailable())
{
Add(binaryReader.ReadByte());
}
}
return byteList.toArray();
OpenFileInput()返回的流没有给出长度,因此每次只能读取一个字节。它也不能寻找。这似乎导致图像的加载速度比实际加载速度慢得多。相比之下,从Resrouce.Drawable加载图像几乎是瞬间的,但使用我的方法,加载8kb文件时会有一个非常明显的暂停,可能是300ms。这似乎是一项非常明显的任务,但我已经尝试了许多解决方案,并寻找了很多建议,但都没有用
我还注意到,当不在UI线程上运行时,这段代码似乎会因EndOfStream异常而崩溃
非常感谢您的帮助您打算如何处理
列表
?您希望“从缓存加载图像”,但没有指定要将图像加载到的内容
如果要将它们加载到中,可以使用:
这将删除列表
中间层
如果您确实需要所有字节(无论出于何种原因),您可以依赖以下事实:System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal)
与相同,这就是context.OpenFileInput()
将使用的内容,允许:
byte[] bytes = System.IO.File.ReadAllBytes(
Path.Combine (
System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal),
"filename.jpg"));
但是,如果这确实是一个缓存,则应该使用而不是Context.FilesDir
,后者返回:
Bitmap Bitmap=BitmapFactory.DecodeStream(context.OpenFileInput(“filename.jpg”)代码>我的上帝。。。只需直接从文件流加载图像就可以了。我觉得有必要首先将所有内容加载到字节数组中,而实际上我没有必要这样做。谢谢,这完美地解决了我的问题。您能告诉我如何从System.Environment.SpecialFolder.Personal
文件夹的子文件夹加载图像吗?
byte[] bytes = System.IO.File.ReadAllBytes(
Path.Combine (
System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal),
"filename.jpg"));
byte[] cachedBytes = System.IO.File.ReadAllBytes(
Path.Combine(System.IO.Path.GetTempPath(), "filename.jpg"));