虐面試官系列Lifecyele篇 – (2)源碼分析之 Event & State

  • 2020 年 2 月 17 日
  • 筆記

前言:

原諒我標題黨??

Lifecycle系列:

虐面試官系列Lifecyele 篇 -(1)基礎講解

虐面試官系列Lifecyele篇 – (2)源碼分析之 Event & State

虐面試官系列Lifecyele篇 – (3)源碼分析之註冊 & 發送

虐面試官系列Lifecyele篇 – (4)源碼分析之響應

待完成:

虐面試官系列Lifecyele 篇 – (5)集成Lifecycle的幾種方式的源碼差別

又是很久很久沒寫文章了,最近打算寫下Android的又一基礎知識: Android 官方架構組件系列。打算把相關的知識點都整理寫下,所以本系列的主體為Lifecycle.


正文

其實我們知道,歸根到底其實源碼講解主要就:基礎類介紹,註冊源碼,發送源碼,響應源碼

虐面試官系列Lifecyele 篇 -(1)基礎講解中,我們講過三種集成Lifecycle方式,我們上面講了三種集成方式,其實一個集成方式源碼通了,其他都都類似。

本文我們會介紹Lifecycle這個基礎類,同時著重講解State和Event相關知識,因為很多人看過之後,總是忘記具體的這二個內容和對應的關係,及為什麼是這樣的對應關係。(也有別人問過我,說理解不了),所以本文著重講這塊內容。

1.1 Lifecycle的State和Event分析

1. 房東類:Lifecycle類

我們知道房東是需要把相關資訊告訴中介,中介統一進行轉述。所以一些相關的所謂的資訊值,也都是房東這邊就會有,比如價格值等定義。

public abstract class Lifecycle {        //'這個方法很直觀,就是添加Observer進來,等會看具體的實現內容'      @MainThread      public abstract void addObserver(@NonNull LifecycleObserver observer);        //'字面意思,移除Observer'      @MainThread      public abstract void removeObserver(@NonNull LifecycleObserver observer);          //'獲取當前的State值'      @MainThread      @NonNull      public abstract State getCurrentState();        //'Event值'      public enum Event {            ON_CREATE,          ON_START,          ON_RESUME,          ON_PAUSE,          ON_STOP,          ON_DESTROY,          ON_ANY      }        //'State值'      public enum State {            DESTROYED,          INITIALIZED,          CREATED,          STARTED,          RESUMED;            public boolean isAtLeast(@NonNull State state) {              return compareTo(state) >= 0;          }      }  }  

我們可以看到主要有二類值: Event和State,從字面意思我們就知道,State是當前Lifecycle的狀態值,而Event是Lifecycle接下去的動作值

(PS:簡單可以理解為房東有二種狀態值,一種是具體的房價價格,比如定了房子賣10000一平米,還有一種是動作值,比如漲價1000元一平米,這麼簡單的類比就更好理解了。)

大家有沒有想過,為什麼Event值有7個(ON_ANY等會我不會在討論範圍內,所以等會我會說明6個Event),而具體的State值就5個???很多人講解文章就理所當然的就說有這麼XXXX的值,如果讓你寫Lifecycle源碼,你又是否會設計成這樣,設計成這幾個值???

我們具體來看下這個問題:

如果正常的畫圖,我估計大家肯定都是畫成:

上面這個圖估計大家也都看得懂,沒有任何問題,因為是橫向鏈條結構,我們可以讓它彎曲,這樣圖片就不會太長了,我們來畫第二個圖:

沒錯,當前我們把上面的具體的Event值一一對應,比如ON_RESUME 對齊 ON_PAUSE, ON_CREATE 對齊 ON_DESTORY,但是我們的State的值實在是太多了,有沒有辦法改變一下???答案當然是可以:

我們可以看到上面這個圖片,我們的onPause被我們改名字了,改成了onStart2,當然實際上它跟上面的onStart是有區別的,實質上它是onPause,那我們把名字改了,還能知道嗎???答案是可以的,為什麼?因為有Event配合,所以就能知道。

可能有些人這裡就有點迷糊了,我來舉個例子: 比如原來房價為13000一平米,漲了1000,變成了14000,再漲了1000變成了15000,這時候跌了1000,又變回了14000,請問這時候二個14000我可以做區分嗎???當然可以,配合動作值就可以,因為一個叫做上漲1000的14000, 一個叫跌了1000的14000。

當然為了好看點,上面的房價變化我們可以寫成:

同理我們的onPause雖然名字改成了onStart, 但是因為是通過ON_PAUSE動作值配合,我們知道這時候的onStart其實是onPuaseonStop 更改為onCreate也是一樣的道理

所以圖片也就變成了:

最後為了對稱好看,我們上下用紅色的補全了相關缺的地方:

我們拿著我們的圖,和Android官方的圖比較一下看看是不是一樣:

所以以後面試官問你關於State和Event相關的值問題,你可以直接懟對方了。

PS: 同時我這裡要額外講一個關於枚舉的小知識點,有利於後面的一些源碼的值判斷的理解:

比如我們拿State這個枚舉來說:

public enum State {        DESTROYED,        INITIALIZED,        CREATED,        STARTED,        RESUMED;  }  

比如當前,對枚舉值比較大小:DESTROYED.compareTo(CREATED),這時候這個值為多少呢??? 我們一步步來看:

public final int compareTo(E o) {      Enum<?> other = (Enum<?>)o;      Enum<E> self = this;      if (self.getClass() != other.getClass() && // optimization          self.getDeclaringClass() != other.getDeclaringClass())          throw new ClassCastException();        //'我們可以看到最後比較 是Enum的ordinal值,也就是順序值'      return self.ordinal - other.ordinal;  }  

所以實際上應該是這樣的:

public enum State {      //順序值為0      DESTROYED,      //順序值為1      INITIALIZED,      //順序值為2      CREATED,      //順序值為3      STARTED,      //順序值為4      RESUMED;  }  

所以DESTROYED.compareTo(CREATED)的結果為: 0 - 2 = -2;

反過來:CREATED.compareTo(DESTROYED)的結果為:2 - 0 = 2

結語

本文我們可以更容易記住Event & State的相關知識。