0

CouchBase をデータストアとして使用する Android アプリケーションの開発。Couch とのやり取りはすべて HTTP 経由であるため、UI スレッドでは実行できません。これは通常、かなり合理的に回避できるものですが、私はこの問題で岩と困難な場所にぶつかっています:

カプセル化/再利用可能な を開発しようとしていますCouchListAdapter。コンセプトは、Couch からページ単位でデータを取得してキャッシュすることです。ページサイズが20であるとすると、初期化時に最初にフェッチ20し、次に要求された場合は21get 21-に移動します40

スレッド上のネットワークが禁止されているため、CouchViewLoaderメソッドJSONObject getItemAt(int i)とを持っている myint getCount()は、持っていないデータを要求されたときに、データを取得するために非同期スレッドを開始する必要があります。データが変更されたことを通知します。

私はほとんどそれを機能させましたが、私が得たところで立ち往生しています:

java.lang.IllegalStateException: アダプターの内容が変更されましたがListView、通知を受け取りませんでした。アダプターのコンテンツがバックグラウンド スレッドからではなく、UI スレッドからのみ変更されていることを確認してください。

UI スレッドで Couch をヒットできないことと、UI スレッドからのみアダプターを更新する必要があることをどのように調整しますか??

確かに他の人がこの問題を解決しましたか?

(これはすべて、特定のビューがメモリに収まらない、または画面に表示できないほど多くの結果を返す可能性があるという考えに基づいて設計されていることに注意してください。)

4

2 に答える 2

0

ローダーでコンテンツ プロバイダーを使用することを検討することをお勧めします。基本的に、必要な情報はすべてこれらのリンクにあります。

一般的なビューの場合:

  • コンテンツ プロバイダーはデータを提供します。
  • ローダーは、バックグラウンド スレッドでコンテンツ プロバイダーからデータを取得します。
  • CursorAdapterローダーがバックグラウンド ジョブを完了すると、CursorTreeAdapter更新するように UI (など) に通知します。

あなたの仕事は:

  • コンテンツ プロバイダーに、サーバーでデータを照会してもらいます。コンテンツ プロバイダーでネットワーク タスクを実行できます。
  • ローダーがフェッチするデータで UI を装飾します。

コンテンツ プロバイダーについては、データを他のアプリケーションと共有するつもりがない場合は、独自のプロバイダーを開発する必要はないと彼らは言います。— しかし、ローダー (サポート ライブラリで古い API をサポートしている) を使用することを強く推奨しているため、私の経験では、コンテンツ プロバイダーは時間を大幅に節約します。私は言います:コンテンツプロバイダーを使ってください:-)

于 2013-03-14T20:59:10.993 に答える
0

AsyncTaskを検討しましたか?

doInBackground(...) で大変な作業を行うことができます。

その後、onPostExecute(...) メソッドで ListAdapter を更新できます。

于 2013-03-14T18:59:26.260 に答える