2015年7月1日 星期三

[Android] Observer與Observable的相關知識

假如你對Observer與Observable還不太熟悉的話,可以先參考我的上一篇文章

Observer與Observable的基本用法

當你的類別實作Observer時,應該會有一個update的方法可以使用。

當Observable,setChanged及notifyObservers時就會去呼叫update這個方法。

我們看一下update這個方法會發現它會回傳兩個值給我們使用。

前者是Observable,也就是被觀察的對象,因為一個觀察者可以觀察很多被觀察者。

所以可以在這邊做判斷,看看到底是哪一個被觀察者發出訊息。

利用instanceof來判斷這個物件是哪個類別的實體。

後者是一個物件,這個更容易理解,你可以在notifyObservers的時候傳送一個物件給他,

就可以在這邊收到那個物件。

發送

收到
另外一個重點,當你結束這個頁面後,要記得刪除這個觀察者。

也就是使用deleteObserver方法來達成。

在Activity的話,可以寫在onDestroy裡面,就像以下的程式碼。

這算是滿重要的觀念之一,若是不刪除的話可能會發生很可怕的事情,有多可怕,可以看一下這個實驗。

我們有兩個Activity,在onCreate的時候加入被觀察者,然後不刪除,看看會發生什麼事情,然後重複切換兩個頁面,當換頁的時候finish上一頁。

Observable有一個方法是可以看到現在有多少觀察者。

切換頁面然後finish,那應該只有一個觀察者存在,上一個都finish掉了,實際程式碼像這樣。

這是第一頁的程式碼



這是第二頁的程式碼


理論上應該都是一個觀察者在觀察,因為上一頁被finish了,但是因為沒deleteObserver,

所以你會看到那個數字一直在上升。

這感覺不太妙對吧,明明那個觀察者已經不見了,但是他還是被算在觀察者之中,你的

Activity會因為這樣而被保留下來,但是因為finish了,你無法去存取他,簡單的說會有一個

無法存取的物件,存在記憶體之中,累計很多的話可能會有不可預期的錯誤。

因此還是要養成deleteObserver的好習慣。