天天看點

淺談Android監聽器中的接口回調

我以為【接口回調】是一個流程或是機制

即從【實作接口方法】到【調用接口方法】這一個完整的“過程”

1.【接口方法】

網絡上有許多種不同的叫法,諸如:接口方法 接口函數 回調方法 回調函數等

在我的了解裡接口方法指的是

接口中的方法(沒有具體實作)

例如

(Android中的展現,官方源碼)

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

void onClick(View v);即接口方法

2.【實作接口方法】/【接口方法的實作】

以上2種說法統統指的是 onClik方法的具體實作

例如

button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    		//to do something..
                }
            });
           

其中 onClick方法的具體實作就是以上2種說法的本意

值得一提的是關于暴露設定接口方法(注冊接口)的意思

我們可以看到上面的例子中setOnClickListener方法就是注冊接口

它在官方源碼中是如何的呢?

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

我們暫且不需要知道官方的具體實作做了些什麼

但是可以很清楚的看到 public void setOnClickListener(@Nullable OnClickListener l)

中傳入的是一個接口變量 (OnClickListener l)

在本例中就是通過setOnClickListener方法注冊接口(并通過匿名内部類的方式實作接口)完成接口的注冊的。

那麼重頭戲來了 接口真正的調用在哪呢?

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);
 
        notifyEnterOrExitForAutoFillIfNeeded(true);
 
        return result;
    }
           

我們同樣不關心該方法的具體實作,

但是OnClick接口在這裡被調用了

有人會認為這個就是接口回調的意思

即接口的具體實作和接口的調用在不同的地方

因為我在開頭就已經認定接口回調是一個機制或者說是流程

是以我認為這裡是一個【接口的調用】

總結【接口回調】流程

硬體(手機)被觸摸或是長按等操作->android系統會調用performClick()方法->

performClick()方法調用接口方法(onclick)->onclick是通過暴露接口(注冊接口)方法

setonclicklistener來讓程式員實作具體的接口方法

而這整個過程即接口回調

以上僅是我個人了解,如有纰漏或是錯誤

請發郵件[email protected]給我留言