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异常而崩溃.
任何帮助将非常感激
你打算怎么做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)
归档时间: |
|
查看次数: |
4629 次 |
最近记录: |