1

私は自分が達成しようとしていることから始めます。

DB からデータを取得するために LoaderCallbacks が関連付けられた ListFragment があります。データは AsyncTask を使用してダウンロードされ、DB に挿入されます。ユーザーがリストの一番下に到達すると、CWAC-Endless ウィジェットを使用して AsyncTask が開始され、さらにデータがダウンロードされます。

私はここでいくつかの問題に直面しており、これを解決しようと何晩も試みましたが、助けを求めるためにここに来ることにしました。

最初の問題は configChanges です。ユーザーがデバイスを回転させると、アクティビティが破棄され、すべてのフラグメントが再作成されます。setRetainInstance を true に設定できることはわかっていますが、Activity が破棄されたときに AsyncTask がまだ実行されているため、これは役に立ちません。

2 つ目の問題は、ローダーに関するものです。データがダウンロードされ、AsyncTask が正常に完了すると、アイテムがリストに正常に表示されます。DBに20個のアイテムがあるとしましょう。ユーザーがデバイスを回転させ、フラグメントが再作成されると、ローダーを再度関連付ける必要があります。これが発生すると、データはすぐにリストにロードされず、代わりにダウンロードの AsyncTask が開始されます。これは、CWAC-Endless アダプターがリストの最後の項目にあると見なすためです。

これらの問題は両方とも私を疲れさせました。どこにも行けないので、これを一新する必要があります。

どんな提案でも構いません。必要に応じてソース コードを投稿できます。

編集

いくつかの提案に役立ついくつかの詳細を次に示します。

インターネットからデータをダウンロードしていますが、一度に設定された数のアイテムのみが返されます。次に、必要なときに追加のデータを要求する必要があります (ページネーション)。

データベースを使用することにしました。新しいローダー機能により、データが効率的かつ一貫してロードされ、スレッドの問題が発生しないことを確認することが非常に簡単になるためです。Loader アプローチを捨てて、標準の Adapter を使用してデータをレンダリングすることが理にかなっている場合は、このアプローチを捨ててそれを使用することに満足しています。この解決策が非常に難しい理由について、誰かが洞察を提供できるかどうかを知りたかっただけです。

ありがとう、

アダム

4

1 に答える 1

1

ユーザーがリストの一番下に到達すると、CWAC-Endless ウィジェットを使用して AsyncTask が開始され、さらにデータがダウンロードされます。

FWIW、私はEndlessAdapterこのようなものの組み合わせ(カーソル、ローダー、およびAsyncTask)を試していません。特に、ドキュメントを引用すると:

これはArrayAdapter広範囲にテストされていますが、他のアダプタ タイプでは動作しない可能性があることに注意してください。

EndlessAdapterローカルデータベースに適用された場合のユースケースがどうなるか、私にはよくわかりません。非常に長いリスト (数千行など) がある場合、答えは「徐々にロードする」ではなく、「長いリストを避けるために別の UX を提供する」ことです。短いリストの場合は、すべてをロードして完了です。EndlessAdapterこれは、読み込みに費用がかかる場合 (インターネット アクセスなど) 用です。

そうは言っても、やることリストに「と遊んで」を追加EndlessAdapterLoaderます。

setRetainInstance を true に使用できることはわかっていますが、アクティビティが破棄されたときに AsyncTask がまだ実行されているため、これは役に立ちません!

そう?onPostExecute()は、新しいアクティビティが完了するまで呼び出されませんonCreate()。さらに、フラグメントベースのモデルでは、タスクはフラグメントと通信する必要があり、そのフラグメントが を介して保持されているsetRetainInstance(true)場合、古いアクティビティと新しいアクティビティの両方で同じフラグメント インスタンスになります。

これが発生すると、データはすぐにリストにロードされません

非同期ではありますが、かなり迅速にロードされるはずです。さらに、これが最初にアクティビティが作成されたときと異なる理由がわかりません。

代わりに、ダウンロード用の AsyncTask が開始されます。これは、CWAC-Endless アダプターがリストの最後の項目にあると見なすためです。

データを取得するまでは作成しないでください。EndlessAdapter

于 2012-03-16T23:22:45.473 に答える