スクリーンショット_2019-03-22_13

[Android] DataBinding-ktx 1.1.1: メモリリーク修正, LiveData 対応しました

追記:DataBinding-ktx 2.0.0 をリリースしました

・・・

DataBinding-ktx とは

Kotlin の Delegated Properties を使って DataBinding の変数宣言を簡単にするライブラリです。このライブラリを使うことによって以下のようにプロパティを宣言することができます。

画像1

ライブラリはこちら→ https://github.com/wada811/DataBinding-ktx
DataBinding-ktx を使うと何が嬉しいのか、DataBinding-ktx の使い方は以下を参照してください。

Fragment でのメモリリークを修正しました

DataBinding-ktx をリリースして上記の記事を公開したところ、takahirom さんに以下の指摘を頂きました。ありがとうございます🙏

Fragment の深淵を覗かないように過ごしてきたので BackStack から復帰して View が再生成することをすっかり忘れていました。下の図の onDestroyView から onCreateView の矢印のルートです。

画像2

onDestroyViewbinding 変数をクリアしないと、binding が View を掴んでいるのでメモリリークしてしまいます。そのため、AAC Lifecycle を利用して binding をクリアするようにしました。

binding 変数のクリア方法の技術的詳細について記載しておきます。Fragment の viewLifecycleOwneronCreateView 以降でないと利用できません。そのため、以下のように 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 は色々なハマりどころがありますが、人間の能力に依存せず、仕組みで解決していきましょう。

ここから先は

0字

¥ 100

この記事が気に入ったらサポートをしてみませんか?