2012-04-09 82 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

相關問題