6.第一篇-View Bindingの性能改善


現在、「反省の食卓」シリーズを通じたプロジェクトの後期を編纂している.MVVM、Firebase、Coルーチン、Github、およびプロジェクトで大きな比重を占める部分.次はどのような文章を書くかを考えて、こまごました開発要素をもう少し書けばあまり有益ではないでしょうか.考えたことがある.そこで、プロジェクト進行中に気になったことを思い出して、今すぐこの問題を解決しましょう.一つ目はView Bindingについての好奇心です

View Binding


まず、View Bindingとは何かを調べてみましょう.まず、Android開発ではfindViewById()とは何かを知る必要があります.特定のビューをクリックしたときに発生するイベント処理コードを作成するとします.では
val myView1 : View = findViewById(R.id.myView1)
myView1.setOnClickListener{

}
という名前のコードを作成しました.ただし、2つのビューを追加すると.
val myView1 : View = findViewById(R.id.myView1)
myView1.setOnClickListener{

}

val myView2 : View = findViewById(R.id.myView2)
myView2.setOnClickListener{

}

val myView3 : View = findViewById(R.id.myView3)
myView3.setOnClickListener{

}
コードはかなり複雑に見えます.実は、私たちが望んでいるのはmyViewというViewオブジェクトだけではありませんか?したがって、findViewById()というコードを使用して特定のビューをインポートする必要がない場合は、この操作を実行します.同じ操作を実行するコードが2つある場合、開発者はより簡潔で簡単なコードを採用します.
myView1.setOnClickListener{

}

myView2.setOnClickListener{

}

myView3.setOnClickListener{

}
そうですか.いっそうきれいになった.気づいたかもしれないし、最初から知っていたかもしれない.ViewBindingを使えばいいです.行く日は市に集まる日だ.使い方を見てみましょう.ViewBindingの使用準備に特別なライブラリを追加する必要はありません.build.gradleに対応するコードを追加するだけです.
android {
        ...
        viewBinding {
            enabled = true
        }
    }
コードを追加すると、各XMLレイアウトファイルのマージクラスが生成されます.
マージクラスにはrootとIDを持つすべてのビューへの参照が含まれます.
盲目的にfindViewByIdを使わないわけではありません.「View Bindingを使用するかどうか」をtrueに設定する場合は、idを含むビュー(myView 1、myView 2、...)を参照してください.含まれるBinding Classが生成されます.もちろん、バインドクラスインスタンスを使用するビューリファレンスです.
class MainActivity : AppCompatActivity() {

    private lateinit var binding : ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityReviewBinding.inflate(layoutInflater)
        setContentView(binding.root)

	binding?.myView1.setOnClickListener{

	}

	binding?.myView2.setOnClickListener{

	}

	binding?.myView3.setOnClickListener{

	}
    }
}
バインドクラス変数を一番上にlate initし、onCreateメソッド内でlayoutInfolterをパラメータに渡して、バインドクラスインスタンスが作成されることを確認できます.binding.rootはレイアウトのrootView(layoutView)を参照し、アクティブデバイスsetContextView()に渡すことで画面を描画します.また,我々が望むようにfindViewById()メソッドを用いる必要がなく,特定のビューの参照を簡単に使用することができる.binding?. という名前のバインドオブジェクトを参照しますが、kotlinのscope関数を使用する場合はbindingは必要ありません.

パフォーマンスの向上


ViewBindingについて理解すると,ViewBindingを適用するのではなくFindViewById()を使用すると,速度が遅くなることが分かった.好奇心はここから始まる.コードが簡略化されるほど、パフォーマンスが遅くなりますか?ちょっとこんな考えです.もちろん、背景知識に乏しい初心者である可能性もあります.しかし、プログラミング言語でもそうです.コードを記述する言語が簡単であればあるほど、パフォーマンスは「ほぼ」低くなりますか?そのため、View Bindingはどのように性能を向上させるかに興味を持っています.

findViewByIdの動作原理


ある程度調べてみると、「ViewBindingが比較的速い理由」は「FindViewByIdが比較的遅い理由」よりも明らかになっています.これはfindViewByIdの動作原理に関係する.
findView ByIdは、View Groupの下部にあるすべてのビューを巡回し、id値を比較します.
オブジェクトとしてのView Groupは、レイアウトが複雑であればあるほど、ビューを巡回する必要があるため、ワークロードが大きくなります.では、ViewBindingの速度が速いのは予想外だったからです.クラスを作成するときにBindingクラスを作成するか、すべてのビューを参照します.

view bindingの動作原理


おおよその見積りは正しい.ViewBindingは、レイアウトファイルをコンパイルするときに、各レイアウトファイルを「事前」にBindingクラスに変換する機能です.これで、View Bindingを使用することで、findView ByIdを呼び出してView GroupでViewを検索する必要がなくなりました.もしそうなら、そう思うかもしれません.
ビューを呼び出す必要のないレイアウトファイルをBindingクラスにプリ変換するのも、リソースの無駄ではないでしょうか.
View Bindingはとっくに予想していたようだ.さらにAndroidドキュメント-View Bindingの導入部分に戻ると、このような内容になります.

後で...知らないうちに読んだ部分なので
bindingクラスの作成時に特定のレイアウトファイルをバインドクラスに変換しない場合は、次の操作を行います.
レイアウトファイルの上部で、tools:viewBindingIgnoreプロパティをtrueに設定します.

Null Safe?


View Bindingを学ぶと、大きく2つの利点がわかります.1つ目は、前述した「パフォーマンス」です.2つ目は「null-safe」です.前に使ったfindViewById()を思い出します.パラメータにid値を含める必要があることは明らかです.
findViewById(R.id.XXX)
R.id.が作成された瞬間、idとして定義されたビューのidリストが自動的に表示され、findViewByIdメソッドにパラメータ値が入力されます.よく思い出すと、別のレイアウトファイルのView idが表示されます.さらに悪いことに、私が欲しくない他のView GroupのIDを付けても赤い線は出ません.つまり、コンパイラはそれをエラーと見なさない.実行時にview変数にnull値が割り当てられていることがわかります.この動作はnot-null-safeです.すなわち、findView ById()がパラメータとして受信したビューID値には、現在のView GroupのビューIDは含まれない.
では、ViewBindingはもちろんこの問題を解決しました.さっき、activity main.xmlレイアウトファイルのバインディングクラスとしてActivity MainBindingを使用しているのではないでしょうか.クラスインスタンスを変数bindingに割り当てることで「binding」します.使用方法はXXX"と同じで、それを通じて自然にactivity mainします.つまりxmlのViewにしかアクセスできません.これはfindViewById()メソッドを使用する場合よりもnullリスクが著しく減少します.

n/a.結論


よりシンプルなビューアクセス方法で、View Bindingがパフォーマンスに優れている理由を理解しました.「勉強を通して、findViewById()は基本的に遅い動作をしていることに気づきました.」「コードが簡単であればあるほど遅い」という固定観念からの疑問を解決した.より簡潔なコードを作成し、パフォーマンスを向上させることは一石二鳥ではないでしょうか.だから知っているのは力です.とにかく、ここでこの文章を終わらせます.