ListViewでデータを非同期で読み込む方法は何ですか?
ListViewでデータを非同期に読み込む一般的な方法は2つあります:AsyncTaskを使用する方法とスレッドプールを使用する方法。
AsyncTaskを利用する:
- AsyncTaskのサブクラスを作成し、そのdoInBackground()メソッドをオーバーライドして、時間のかかる処理を行う。たとえば、ネットワークからデータを読み込むなど。
- doInBackground()メソッド内で、進捗を更新するためにpublishProgress()メソッドを使用します。
- onProgressUpdate()メソッドを再書きして、UI画面を更新し、データをListViewに追加する。
- onPostExecute()メソッドでUIを更新し、ロードが完了したことを表示したり、ロードに失敗したメッセージを表示したりします。
- ListViewのアダプターでは、必要に応じてgetItem()やgetCount()などのメソッドを実装します。
スレッドプールを使用します。
- スレッドプールオブジェクトを作成するには、ExecutorService executor = Executors.newFixedThreadPool(5) のようにします。
- データを非同期でロードする必要がある場合、タスクをスレッドプールに送信して実行します。例えば、executor.execute(new Runnable() { … })。
- run()メソッド内で、ネットワークからデータをロードするなどの時間がかかる処理を実行します。
- run()メソッド内で、データをUIスレッドに送信するためにHandlerを使用します。handler.sendMessage()を使用します。
- UIスレッド内のHandlerを使用して、受信したメッセージを使用してUIを更新します。例えば、読み込んだデータをListViewに追加するなどの作業を行います。
AsyncTaskやスレッドプールを使用する場合でも、データをロードする過程でUIを更新する必要があります。