Observerの削除
DB読み込み機能を作っていて、奇妙なこと?に気がつきました。1回しか実行していないはずのToast表示が、複数回出てくることがあるのです。
登録ボタンを押すと、
- Control : CharacterCreateActivity#onClick()
- Model : CharacterList#save()
- View : CharacterCreateActivity#onSaved() ←ここでToast
という順番で実行されますが、ボタン1回につきToastが3〜4回くらい出てきてるような…?
調べたところ何のことはない、CharacterList(Subject)へのCharacterCreateActivity(Observer)の登録が重複していたのでした。
- アプリ実行開始
- CharacterCreateActivityのインスタンス作成
- CharacterList#addListener()でObserver登録
- ...
- アプリ実行終了
- アプリ再実行開始
- CharacterCreateActivityのインスタンス作成
- CharacterList#addListener()でObserver登録(2個目)
- ...
という流れで徐々にAcitivityのインスタンスが増えていき、その全てに対してイベント通知していたのでToastが何回も出てきていました。CharacterListもActivityもfinish()でアプリを終了させただけでは破棄されないようなので、Activityのライフサイクルを勉強して、重複しないように適宜Observerを削除する必要があります。二日間 更新を飛ばしてしまったうえに脱線してしまい恐縮ですが、明日以降 Activityのライフサイクルについて掘り下げようと思います