2012-04-09 24 views
0

在单声道为Android我有一个应用程序,将图像保存到本地存储为缓存目的。当应用程序启动时,它会尝试从缓存中加载图像,然后尝试从网络加载它们。从单片机上的本地存储读取图像文件为Android

我目前很难找到从本地存储读取和加载它们的好方法。目前我使用的东西equivilant这个

 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(); 

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

我也注意到这段代码似乎在没有在UI线程上运行时发生EndOfStream异常。

任何帮助将非常感激

回答

8

你打算在与List<byte>干什么?你想“从缓存中加载图像”,但是你没有指定你想要加载到的文件。

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

Bitmap bitmap = BitmapFactory.DecodeStream(context.OpenFileInput("filename.jpg")); 

这将消除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")); 

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

byte[] cachedBytes = System.IO.File.ReadAllBytes(
     Path.Combine(System.IO.Path.GetTempPath(), "filename.jpg")); 
+0

'位图位= BitmapFactory.DecodeStream(context.OpenFileInput( “filename.jpg”));' 我的上帝......直接从文件流中直接加载图片效果很好。当我真的没有必要的时候,我觉得有必要首先将所有东西加载到一个字节数组中。感谢这一点,完美地解决了我的问题。 – battlebottle 2012-04-09 19:24:53

相关问题