2011-10-24 14 views
0

ArrayAdapterからアイテムを追加、削除、クリアするのに、AsyncTaskクラスを使用しています。残念なことに、これらのタスクのいずれかが実行されると、はnotifyDataSetChanged()になります。そのためには、uiThreadでスレッドを実行する必要があります。Android - ArrayAdapterを非同期で更新するにはどうすればよいですか?

ArrayAdapterを非同期的に更新するためにrunOnUiThread(new Runnable(){...});を使用した場合、それを新しいスレッドで更新しようとする目的を敗北させませんか?

ここで最善のアプローチは何ですか?

答えて

4

do .notifyDataSetChanged() insde onPostExecute()方法。 onPostExecute()メソッドはUi-Threadで実行されます。アプリがdoInBackground()メソッドの実行中に定期的に更新する必要がある場合は、publishProgress()onProgressUpdate()メソッドを使用します)を使用し、onProgressUpdate()メソッドの中でnotifyDataSetChanged()メソッドを呼び出します。これもUiスレッドで実行されます。

0

あなたの最初の質問に答えるために、UIスレッドで呼び出す唯一のものがnotifyDataSetChanged()である限り、runOnUiThreadの呼び出しは目的を破るものではありません。 AsycnAdpaterであなたの実際の潜在的な長時間実行されているすべてのタスクを実行し、アクティビティが変更されたことを知らせる準備ができたら、runOnUiThread()に電話してください。それはあなたが渡すRunnableで指定したコマンドだけを実行します。

つまり、AsyncTaskを使用する代わりに、AsyncTaskLoaderを試してみてください。 AsycnTaskLoadersはリストを非同期的に取り込むために設計されました。 APIレベル10まで導入されていませんでしたが、android Support Packageを使用して古いAPIレベルからアクセスできます。

1

他の誰もがすでに言ったことに何かを追加するだけで、あなたのタスクが実行された後に、あなたが作業しているビューのアダプタ(または新しいもの)を再度設定することができます。

AFAIKは、コードに応じて、notifyDataSetChangedの後、またはカーソルを更新した後で、参照を使用していない場合はビューがすぐに更新されないことがあります。

アクティビティを終了して戻ったときにビューが更新された場合は、おそらくアダプタを再度設定する必要があります。