0

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

OpenFileInput() は長さを示さないストリームを返すため、一度に 1 バイトずつ読み取る必要があります。また、シークもできません。これにより、画像の読み込みが通常より遅くなるようです。Resrouce.Drawable からの画像の読み込みは、比較するとほぼ瞬時に完了しますが、私の方法では、8kb ファイルを読み込むために、おそらく 300 ミリ秒の非常に顕著な一時停止があります。これは非常に明白なタスクのように思えますが、私は多くの解決策を試し、アドバイスを求めて多くのことを検索しましたが、役に立ちませんでした。

また、UI スレッドで実行されていない場合、このコードが EndOfStream 例外でクラッシュするように見えることにも気付きました。

どんな助けでも大歓迎です

4

1 に答える 1

9

で何をするつもりList<byte>ですか?「キャッシュから画像をロードする」必要がありますが、画像を何にロードするかを指定しませ

それらをAndroid.Graphics.Bitmapにロードする場合は、 BitmapFactory.DecodeStream(Stream)を使用できます。

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

List<byte>これにより、仲介者が削除されます。

(何らかの理由で)本当にすべてのバイトが必要な場合は、 Context.FilesDirSystem.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal)と同じであるという事実に頼ることができます。これは、以下を許可して使用します。context.OpenFileInput()

byte[] bytes = System.IO.File.ReadAllBytes(
        Path.Combine (
            System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal),
            "filename.jpg"));

ただし、これが本当にキャッシュである場合は、 Path.GetTempPathが返すのではなくContext.CacheDirを使用する必要があります。Context.FilesDir

byte[] cachedBytes = System.IO.File.ReadAllBytes(
        Path.Combine(System.IO.Path.GetTempPath(), "filename.jpg"));
于 2012-04-09T15:42:39.637 に答える