[Android] DataBinding-ktx 1.1.1: メモリリーク修正, LiveData 対応しました
追記:DataBinding-ktx 2.0.0 をリリースしました
・・・
DataBinding-ktx とは
Kotlin の Delegated Properties を使って DataBinding の変数宣言を簡単にするライブラリです。このライブラリを使うことによって以下のようにプロパティを宣言することができます。
ライブラリはこちら→ https://github.com/wada811/DataBinding-ktx
DataBinding-ktx を使うと何が嬉しいのか、DataBinding-ktx の使い方は以下を参照してください。
Fragment でのメモリリークを修正しました
DataBinding-ktx をリリースして上記の記事を公開したところ、takahirom さんに以下の指摘を頂きました。ありがとうございます🙏
Fragment の深淵を覗かないように過ごしてきたので BackStack から復帰して View が再生成することをすっかり忘れていました。下の図の onDestroyView から onCreateView の矢印のルートです。
onDestroyView で binding 変数をクリアしないと、binding が View を掴んでいるのでメモリリークしてしまいます。そのため、AAC Lifecycle を利用して binding をクリアするようにしました。
binding 変数のクリア方法の技術的詳細について記載しておきます。Fragment の viewLifecycleOwner は onCreateView 以降でないと利用できません。そのため、以下のように onStart を監視して、onStart で viewLifecycleOwner を使って onDestroyView を監視しています。
thisRef.lifecycle.addObserver(object : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onViewCreated() {
thisRef.lifecycle.removeObserver(this)
thisRef.viewLifecycleOwner.lifecycle.addObserver(object : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onDestroyView() {
thisRef.viewLifecycleOwner.lifecycle.removeObserver(this)
binding = null
}
})
}
})
LiveData に対応しました
LiveData を DataBinding する際には binding 変数の setLifecycleOwner を呼んであげる必要がありますが、忘れてしまってハマったという声があったので DataBinding-ktx で bind したら自動で setLifecycleOwner を呼び出すようにしました。
Android は色々なハマりどころがありますが、人間の能力に依存せず、仕組みで解決していきましょう。
ここから先は
¥ 100
この記事が気に入ったらチップで応援してみませんか?