1

通常の状況では、リストビューを更新するためにバックグラウンド スレッドで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 レクチャーリンクを参照してください。本当に助かります。

4

1 に答える 1