2012-04-09 2 views
0

안드로이드 용 모노에서 캐싱을 위해 이미지를 로컬 저장소에 저장하는 앱이 있습니다. 앱이 실행되면 웹에서 이미지를로드하기 전에 캐시에서 이미지를로드하려고 시도합니다.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에서 이미지를로드하는 것은 거의 비슷하지만, 내 방법은 8KB 파일을로드하는 데 아주 눈에 띄는 일시 중지 (아마도 300ms)가 있습니다. 이것은 할 수있는 것이 분명한 작업처럼 보입니다. 그러나 많은 솔루션을 시도하고 많은 조언을 구했으나 아무 소용이 없습니다.

나는이 코드가 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.OpenFileInput()가 사용할 것 인 Context.FilesDir 같은 사실에 의존 할 수있는 모든 바이트를해야하는 경우 다음과 같은 경우,

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")); 
+0

'비트 맵 비트 맵 = BitmapFactory.DecodeStream (context.OpenFileInput (이, 당신은 Path.GetTempPath 반환되는 대신 Context.FilesDirContext.CacheDir을 사용해야 진정한 캐시입니다 "filename.jpg")); ' 세상에 ... 파일 스트림에서 곧바로 이미지를 로딩하면됩니다. 내가 정말로 필요가 없을 때 모든 것을 바이트 배열에 먼저로드 할 필요성을 느꼈다. 고마워, 내 문제를 완벽하게 해결. – battlebottle