2010-12-15 6 views
0

大きなビットマップ(フルスクリーン、wvga)がたくさんあるギャラリーを表示するとき、私は頻繁にメモリの問題を解決します。私はリサイクルされていないビットマップに関連していると考えています。いつビットマップをリサイクルすることができますか?AndroidビューのSimpleCursorAdapterで、ギャラリービューでビットマップをリサイクルすることはできますか?

また、simpleCursorAdapterのgetViewメソッドでは、convertViewは常にnullであることに気付きました。これは古いビューがリサイクルされていないことを意味します。前後にスクロールしても、毎回新しいビューが作成されます。ただし、前後にスクロールしてもメモリ不足の問題は発生しません。これは、イメージの総数が十分に大きい場合にのみ発生します。

ListViewで同じアダプタを使用すると、ビューがリサイクルされるため、ギャラリーに問題があるようです。

ビューやビットマップを強制的にリサイクルするにはどうすればよいですか?ギャラリーのサイズやビットマップの品質を落とさずに、メモリを管理できることは他に何かあります。

+0

あなたは 'purgeable'のようなさまざまなビットマップオプションを試しましたか?ギャラリーにプレスケールまたは高品質の画像を使用していますか?メモリ管理のために 'SoftReference' /' WeakReference'を見たことがありますか? –

答えて

-2

あなたは決してが必要です。は、Bitmapを書き留めてください。ただし、となります。OutOfMemoryのエラーが発生した場合に役立ちます。 getPixels()またはsetPixels()が呼び出さ で、何を描きません場合に例外がスローされます(javadocのから)

のでビットマップは、もはや必要でなくなるまでしかし、それをしないでください。この の操作を元に戻すことはできませんので、 は、確信がある場合にのみ呼び出すようにしてください。 ビットマップの用途はありません。あなたのケースでは

、私はあなたがすべきであると仮定します。ビットマップはBitmapFactory.Options.inSampleSizeまたはMediaStore.Images.Thumbnails

  • で開かれ

    • 使用の親指が(メモリであなたにプリロード多分1つだけで、多くても1つのフルサイズのビットマップを持っています余裕があります)
  • +1

    右には、*必要*はありませんが、そうしないとアプリケーションがクラッシュします。どのように「必要性」を正確に定義していますか? –

    +0

    「必要性」というGoogleの定義が異なります。 pre-HCでビットマップをリサイクルする必要があります。 – Raz

    0

    たとえば、一時ビットマップを使用した操作など、ビットマップを使用しないことが確かであればrecycle()を使用できます。しかし、あなたはBitmapFactory.Optionsを使うことができます。例えば、

    BitmapFactory.Options bitmapOptions = new BitmapFactory.Options(); 
    bitmapOptions.inPurgeable=true; 
    
    Bitmap bitmapTemp = BitmapFactory.decodeResource(getResources(), R.drawable.intro, bitmapOptions); 
    

    それは何ですか? inPurgeableオプションは、システムがメモリを必要とし、ビットマップが役に立たなくなると、システムはこのメモリ割り当てを単独でリサイクルすることを想定しています。何らかの理由でBitmapFactoryでイメージを読み込めない場合は、Recycle()を使用することができ、ガベージコレクタをsystem.gc()で呼び出すことをお勧めします。これは、例えばゲームを開発する場合に便利です。ガベージコレクタは、システムのメモリが不足しているときに起動されます。これはかなりの時間がかかります。 ビットマップは、Android 3.0を使用していない限り、あなたのアプリで使用される「通常の」メモリには保存されず、すべてのアプリで使用される「一般的な」メモリに保存されます。 メモリリークが発生し、ヒープを調べることができない場合は、コードの読み込みとビットマップの使用を見てください。 お手伝いをしてください。

    関連する問題