1

私は自分が持っている多くのビットマップタイルのキャッシュの実装に取り​​組んでいます。私がこれまでにしたこと:

LRUキャッシュシステムの実装に成功しましたが、アプリのリソースからタイルを読み込む必要がある場合でも、タイルの読み込みが遅くなります。キャッシュのヒット率は現在約85%です。

リソースからビットマップをロードする必要があるときはいつでも、私が言ったようにそれはまだ遅いです。これを念頭に置いて、非同期タスクからビットマップを読み込んでいます。これ以前は、すべてがエラーなしで読み込まれていましたが、かなり低速でした。現在、メインスレッドで動作していないため高速ですが、必然的にOOMエラーが発生します。これが私の非同期タスクのコードです:

public class loadBitmap extends AsyncTask<Void,Void,Void>
{
    Bitmap bit;
    @Override
    protected Void doInBackground(Void... params) 
    {
        Options opts = new Options();
        bit = BitmapFactory.decodeResource(reso, drawable, opts);
        return null;
    }

    @Override
    protected void onPostExecute(Void result) 
    {
        // TODO Auto-generated method stub
        drawLoadedBit(bit);
        super.onPostExecute(result);
    }
}

メモリ不足エラーが発生しないようにこれを実装する方法についてのアイデアはありますか?これはdrawメソッドで呼び出されるので、複数回の呼び出しが原因だと思います。アドバイスありがとうございます。

4

2 に答える 2

1

このリンクを参照してください

彼は、再生成ビットマップの使用に関する優れたチュートリアルを提供しています。さらに、[ビューが破棄されたら] ビューからビットマップを分離するには、@Override View#onRemovedFromWindow() でビットマップをリサイクルします。さらに進んで、この問題が解決しない場合は、ビットマップを割り当てる BitmapPool を作成できます。アルゴリズムを実装して、ビットマップのサイズを計算し、任意のメモリ量を超える古いビットマップをリリースすることができます (ビットアンプ メモリは、約幅 * 高さ * 4 + オブジェクト サイズであり、公称である必要があります)。

于 2012-06-04T17:54:31.890 に答える
0

がロードされたら、Bitmapクラス変数に保持します。次回ドローがリクエストされたときは、リソースから再度ロードする前に、クラス変数が null でないかどうかを確認します。

于 2012-06-04T17:34:20.523 に答える