通常の状況では、リストビューを更新するためにバックグラウンド スレッドでListAdapter.notifyDataSetChanged () を呼び出すことはできません。だから私はこのように回避しようとしました:
class mythread extends thread {
private ListAdapter listAdapter;
...
public void run() {
listAdpater.setNotifyOnChange(false);
listAdapter.addAll(A_LARGE_ARRAY);
}
...
}
スレッドが終了すると、UI スレッドで実行されているハンドラーにメッセージが送信され、listAdapter.notifyDataSetChanged() が呼び出されてリストビューが更新されます。
デバッグしようとしたときを除いて、デバッガーは「アダプターが変更されましたが、リストビューは通知を受け取りません。UIスレッドでのみアダプターを変更するようにしてください。」
setNotifyOnChange(false) を呼び出しても、Android フレームワークはアダプターの変更を監視しますか? 回避する方法はありますか?
PS。私自身のベンチマークでは、listAdapter.addAll(A_LARGE_ARRAY) をバックグラウンド スレッドに移動することで、約 126 ミリ秒の実行時間を節約できました。つまり、UI スレッドでアダプターを変更すると、アダプターは 126 ミリ秒ブロックされます。
更新
この問題に遭遇した人は、このGoogle I/O レクチャーリンクを参照してください。本当に助かります。