Observerの削除

DB読み込み機能を作っていて、奇妙なこと?に気がつきました。1回しか実行していないはずのToast表示が、複数回出てくることがあるのです。
登録ボタンを押すと、

  1. Control : CharacterCreateActivity#onClick()
  2. Model : CharacterList#save()
  3. 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のライフサイクルについて掘り下げようと思います