最近データバインディングを使用していて、executePendingBindings
メソッドに遭遇しました。ドキュメントはそれについてほとんど示しておらず、それがどのように機能するのか、いつ使用するのか理解できません。
多くの開発者がonBindViewHolderコールバック内でexecutePendingBindingsを使用していますが、それを使用するかどうかにかかわらず、リサイクラーで自分自身に違いはありません。
誰かがリサイクル業者で使用することが重要な理由を説明できますか?ありがとう
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
Customer customer= List.get(position).second;
((CustomerViewHolder)holder).binding.setCustomer (customer)
((CustomerViewHolder)holder).binding.executePendingBindings();
}
バインディングに変更を加えても、View
にimmediateの影響があるとは限りません。バインディングで変更を行うということは、それらの変更が最も近い将来に適用されるように本当にスケジュールしているということです。これは多くの理由であり、パフォーマンスはその1つです。
Xmlにいくつかの複雑な式があると想像してください。すべての変数を設定する前に、変数のバインドに関連するすべてを把握する必要はありません。それは資源の浪費になります。
詳細については、生成されたバインディングJavaクラス自体を参照してください。これを一読することをお勧めします。
executePendingBindings
を呼び出すと、バインディングを呼び出す時点で、フレームワークにこれまでに必要なすべての処理を強制的に実行させることになります。
あなたのケースがそれを必要としない場合、あなたはあなたのアダプタでそれをするする必要はありません。一部の人々は、先に進む前にすべてがアイテムに適切に設定されていることを確認するためにそれを行っています。したがって、たとえば前のラウンドのバインディングが実行される前にonBind
が再度呼び出されるようなケースはありません...または同様の...
編集1:
また...変更を実行するスケジュール(最も近い将来)は、setVariables
スレッドとは異なるスレッドからbinding
でUI
を実行できることを忘れないでください。変数を設定してもView
自体には影響しないためです。
編集2:
生成されたJava=クラスを確認する最も簡単な方法は、次のとおりです。
Binding
を入力します(例:レイアウトがactivity_main
、タイプActivityMainBinding
)特筆すべきこともあります。 executePendingBindings()を呼び出すと、リストはこの呼び出しがない場合ほど滑らかではなくなります。 executePendingBindings()がUIスレッドで処理を行うので、 500要素のリストを想像してみてください。そして、UIでこのメソッドを呼び出すたびに。 「アプリケーションがメインスレッドで実行している作業が多すぎる可能性があります」と表示されます。