2013-01-09 9 views
11

私はアンドロイドアプリケーションで作業しています。リストビューを含むアクティビティがあります。リストビューアイテムは、ユーザーがスクロールしたときにメモリからビットマップを削除します

リストビューには多数のアイテムがあり、それぞれにビットマップイメージが含まれています。

リストが非常に大きく、ビットマップをロードするときに古いデバイスのメモリエラーが出ていて、多くのイメージが含まれているためです。

だから私は古いデバイスに対して次の操作を行うための方法を探しています:

  • は、ビュー(またはそれに近い)にあるアイテムのためのビットマップをロードし
  • ときにユーザーがスクロールダウン私は、表示されるはずのビットマップをにロードし、今すぐ非表示になっているビットマップを削除します
  • したがって、ビュー内(またはその近く)にある画像のみがヒープに読み込まれ、残りの画像はビューに表示されなくなったときに削除されます。

これを行う方法はありますか?

追加情報:

私は(アンドロイドドキュメントに、私は見つけることができる任意のサイト上で)効率的にビットマップイメージをロードする方法に関するすべての指示やコードに従ってきた、私はまた、何のメモリがないことを確認しましたリークが発生すると、すべてのビットマップをリサイクルし、GCが正しく動作していることを確認します。古いデバイスでは、イメージの解像度をできるだけ小さくしました。しかし、リストのサイズによって、メモリ不足が一部のデバイスで引き続き表示されています。

私は上記の解決策を実行できるかどうかを知りたいと考えています。あなたは「遅延ロード」のため、いくつかのチュートリアルと例を検索したい任意のヘルプ

+0

ビューホルダーパターンを実装しようとしましたか? –

答えて

11

Google I/O 2012のサンプルギャラリーアプリをご覧ください。必要なものはすべてここに実装されています。

Video from Google I/O about gallery app

ソースコードがGoogle Codeで利用可能であり、それはギャラリーを構築するexclellent例です。 Romain Guyのpresentation(初め)を見て、パフォーマンスの問題をListViewで説明し、アダプターを効率的に使用する方法を教えてください。 (ViewHolderパターンとビューの再利用)。

ここには、GridViewのRecycleListener(APIレベル1から利用可能)があります。 RecyclerListenerは、ViewがRecycleBinのスクラップヒープ内に置かれたときに通知を受け取るために使用されます。このリスナーは、RecycleBinに配置されたビューに関連付けられたリソースを解放するために使用されます。

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.album); 

    mAdapter = new PhotoAdapter(this); 

    mGridView = (GridView) findViewById(android.R.id.list); 
    mGridView.setAdapter(mAdapter); 

    mGridView.setRecyclerListener(new RecyclerListener() { 
     @Override 
     public void onMovedToScrapHeap(View view) { 
      // Release strong reference when a view is recycled 
      final ImageView imageView = (ImageView) view.findViewById(android.R.id.icon); 
      imageView.setImageBitmap(null); 
     } 
    }); 

    // Kick off loader for Cursor with list of photos 
    getLoaderManager().initLoader(LOADER_CURSOR, null, mCursorCallbacks); 
} 
+0

ありがとう! – kaitian521

0

ため

どうもありがとうございました。
可能な例は次のとおりです。https://github.com/thest1/LazyList

+1

私はこれに間違いがあるかもしれませんが、表示されているイメージをロードするだけで、ロードされているものを取り除くのではなく、怠惰なローディングではありませんか? – Youssef

+0

これは実装によって異なります。たぶんデフォルトで怠惰な読み込みがあなたの記述方法ですが、私が知っているのは、提供されている例がそうではないということです。 UIパターンアプリで動作していることがわかります(他の偉大なライブラリの多く):https://play.google.com/store/apps/details?id=com.groidify.uipatterns –

0

Universal Image Loaderのようなライブラリを使用すると、イメージとメモリ管理をキャッシュするオプションが提供されます。それを介して最大キャッシュサイズを設定することができるはずですし、バックグラウンドスレッドでイメージをロードすることもできます。

ListViewは、その点で画像を配置してメモリ上で簡単に移動するビューをリサイクルします。

+0

ピカソのようなものもうまくいくかもしれません。 –

関連する問題