2012-04-09 1 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() возвращает поток, который не дает мне длину, так что я должен прочитать один байт в то время. Он также не может искать. Кажется, это заставляет изображения загружаться намного медленнее, чем они. Загрузка изображений из Resrouce.Drawable почти мгновенно сравнима, но с моим методом есть очень заметная пауза, возможно, 300 мс, для загрузки файла 8 КБ. Это похоже на действительно очевидную задачу, которую можно сделать, но я пробовал много решений и много искал для консультации, но безрезультатно.

Я также заметил, что этот код, похоже, аварийно завершает исключение 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

'Bitmap растровый = BitmapFactory.DecodeStream (context.OpenFileInput ("filename.jpg")); ' Мой бог ... просто загрузка изображения прямо из фильтра работает отлично. Я чувствовал необходимость сначала загружать все в байтовый массив, когда мне действительно не нужно было. Спасибо за это, отлично решает мою проблему. – battlebottle