5

Android に単純な無限スクロール GridView を実装しました。次のコンポーネントがあります。

  1. GridView が一番下までスクロールされるたびに、AsyncTask を開始してより多くの項目をアダプターにロードします。
  2. AsyncTask からフェッチされた項目を追加し、notifyDataChanged() を起動して GridView がそれ自体を更新できるようにするアダプター。

これは、アダプターが無期限に成長している場合を除いて、正常に機能しているようです...ユーザーが最後までスクロールするたびに、このアダプターにアイテムを追加し続けることを意味します。これはメモリの問題のようです。

無限アダプターを実装する適切な方法は何ですか? 私のためにそれを行うサードパーティのjarファイルではなく、コンセプトを探しています。

ありがとう


マークされた答えには正しい理論があります。私の実装では、ロードされたデータを sqllite データベースにバックアップするため、全体の流れは次のとおりです。スレッドでインターネットからデータをダウンロードし、データを解析してスレッドでデータベースに保存し、UI スレッドで notifyDataChanged を起動します。
アダプタの getCount() メソッドは、データベースから count(id) を選択するだけで、オブジェクトのバッチを一度にデータベースからメモリに取得して、アダプタが使用できるようにします。

4

1 に答える 1

3

はい、一般的にあなたが無限である場合GridView、あなたAdapterは無限です。より多くのデータをメモリにロードするという単純な実装がある場合は、ある時点で確かにメモリの問題が発生します。これを回避するには、ある時点で古いデータを解放する必要があります。

アダプタがデータを取得する「無限の」ストア(多くの場合インターネット)にアクセスできると仮定すると、アダプタのメモリに保持するデータの最大サイズ(バイト単位またはアイテム数)を設定することを検討できます。最大サイズを超えると、メモリから古いアイテムを削除できます。これらの古いアイテムが再度要求された場合は、メモリからではなく無限ストアから再度ロードします(おそらく、他の古いアイテムはメモリから削除されます)。

これは、GridViewアイテムが、ある種の(おそらく外部の)ストアによってバックアップされたAdapterある種のキャッシュ(ここで役立つ可能性があります)にデータを格納するから構築されていることを意味します。LruCacheまた、メモリキャッシュと外部ストアの間にディスクキャッシュを配置することもできます。

于 2013-01-07T18:38:01.713 に答える