Android開發學習之路-回調機制學習筆記

不知道是我學Java的時候沒有認真聽仍是怎麼的,曾經一直不知道什麼是「回調」,它有什麼用,百度一大堆,都太複雜看不明白(好吧是我笨),因此想把本身理解的分享給其餘看到的人,你們都真正認識一下這個重要的機制。html

若是你要進行Android開發,那麼回調確定是會常常用到的,爲何?下面慢慢來講,大牛其實這個地方已經能夠離開了......git

先從簡單的開始,什麼是回調?github

Java容許咱們調用接口的方法,可是有一個前提,就是編譯的時候接口的對象必須是一個具體的類,而且這個類實現了接口。當咱們調用接口的方法的時候,接口的具體子類中的具體方法會被調用,這就是回調。嗯,我說什麼鬼?仍是上代碼吧。app

public interface A {
    void printClassName();
}
public class B implements A {
    public void printClassName() {
        System.out.println("This is class B!");
    }
}
public static void main(String[] args) {
        A a = new B();
        a.printClassName();
}

輸出的結果以下:ide

從上面的代碼能夠看到,咱們在主函數中定義了接口A,也調用了接口A的方法,可是要注意,咱們實例化的時候其實new的是一個實現了A接口的具體類,咱們調用A中的printClassName方法的時候Java就會去回調B中的該方法。這樣作的優勢是什麼?就是咱們在調用的時候,能夠徹底無論A的子類是如何實現A中的方法的,只須要調用這個方法便可,怎麼實現,咱們無論,那是子類的事情了,這樣實際上是解耦的一種很好的方法,若是咱們要修改成別的類,只須要把new後面的子類改掉就好。函數

是否是很簡單?若是代碼你都懂,那麼恭喜你,你已經距離成功只有一步之遙了。this

說回Androd,其實裏面是有不少地方用到這個機制的,咱們也是從簡單的提及。spa

不少時候,咱們對某個控件實現點擊事件的監聽,會像下面這樣作:code

Button btn = new Button(this);
btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // doSth
    }
});

不少人都以爲,這樣很直接明瞭啊,但是若是我問你,爲何咱們要new一個OnClickListener進去呢?若是你不知道,證實你還不徹底瞭解回調。按照咱們上面所說的,咱們能夠調用接口的方法,可是接口須要一個具體的實現,因此咱們應該知道,setOnClickListener中的參數應該是一個接口,不信?咱們一塊兒看看源碼orm

public interface OnClickListener {
        /**
         * Called when a view has been clicked.
         *
         * @param v The view that was clicked.
         */
        void onClick(View v);
}

果真,接口中還有一個onClick方法。既然是回調,咱們再看看這個方法在哪裏被調用了

先看setOnClickListener方法

public void setOnClickListener(@Nullable OnClickListener l) {
        if (!isClickable()) {
            setClickable(true);
        }
        getListenerInfo().mOnClickListener = l;
}

關鍵是把OnClickListener的對象賦值給了ListenerInfo的mOnClickListener,咱們再看下去

public boolean performClick() {
        final boolean result;
        final ListenerInfo li = mListenerInfo;
        if (li != null && li.mOnClickListener != null) {
            playSoundEffect(SoundEffectConstants.CLICK);
            li.mOnClickListener.onClick(this);
            result = true;
        } else {
            result = false;
        }

        sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
        return result;
    }

咱們看到在這個叫作performClick的方法中調用了onClick方法,還有另一個叫作callOnClick的方法也會調用onClick,區別能夠去看看源碼的說明,這裏不詳細。那麼這兩個方法又在何時被執行的呢?其實他們都是在屏幕接收到點擊信號的時候,把數據一層一層的往上傳遞給framework,由framework來調用。對於瞭解回調,我以爲到這裏就足夠了,再往下就有點偏了。

要明白的一點就是,在這個類中,調用的是接口的方法。如今你應該明白了吧,爲何咱們要new一個OnClickListener的子類呢?就是讓編譯器知道,調用接口方法的時候,去回調咱們設置的OnClickListener子類的對應方法。

若是到這裏你都懂了,很好,咱們再說多一些,具體一些。

究竟咱們知道了這個機制以後,它有什麼用呢?通常來講,用得比較多,就是通訊以及MVP模式

通訊,其實就是不一樣組件之間的通訊,能夠是Fragment和Activity,也能夠是Adapter和Activity,這裏不詳細說太多,能夠看看以前的博文:http://www.cnblogs.com/Fndroid/p/5187444.html

上面咱們說到了MVP,這個模式真的很重要,對於比較大的項目來講,意義很深遠,既能幫助咱們解耦不堪重負的Activity,也能便於咱們維護和擴展,有興趣能夠參考下面這個項目:https://github.com/bboyfeiyu/the-tech-frontier-app

相關文章
相關標籤/搜索