標籤:
為什麼會學習回呼函數,那還要從線程說起。雖然以前寫過一篇文章叫做“Android自學曆程—多線程”,現在看看還是太年輕了。
在學習線程的時候,我試著看了看Handler的源碼,於是對其中的Callback介面產生了興趣。於是補自身不足,拿來學習學習。廢話到此為止,整理思路,一起來學習。
下面這是一段Handler的源碼
/** * Callback(回收) interface(介面) you can use when instantiating(例示) a Handler to avoid * having to implement(實施) your own subclass(亞綱) of Handler. * * @param msg A {@link android.os.Message Message} object * @return True if no further handling is desired */ public interface Callback { public boolean handleMessage(Message msg); } /** * Subclasses(亞綱) must implement(實施) this to receive messages. */ public void handleMessage(Message msg) { }
上面的中文翻譯不是我翻譯的,翻譯軟體乾的好事,沒一個對的。。。
Handler相信大家都用過,當我們執行個體化一個Handler時,大家都說我們要實現其中的方法,其實就是實現HandleMessage的方法。
我們再來看看源碼,對此的實現方式。首先是Callback方法的介面,既然是介面,那我們就必須實現其中所有的方法,既“handleMessage”方法。
大家再看看上面我用紅色標註的英文,是不是有了感覺,別急。我們再來找個例子看看。
下面是一段OnClickListener的源碼
/** * Interface definition for a callback to be invoked when a view is clicked. */ public interface OnClickListener { /** * Called when a view has been clicked. * * @param v The view that was clicked. */ void onClick(View v); }
我們來看一下紅色標註的這段話:當一個View被點擊時,這個介面定義的回呼函數將會被觸發。我們並不會顯示的調用OnClick方法,使用者觸發了這個點擊事件,系統會去調用這個OnClick方法。
我有順路把setOnClickListener的源碼找了過來,可能對後面有助於理解
/** * Register a callback to be invoked when this view is clicked. If this view is not * clickable, it becomes clickable. * * @param l The callback that will run * * @see #setClickable(boolean) */ public void setOnClickListener(OnClickListener l) { if (!isClickable()) { setClickable(true); } getListenerInfo().mOnClickListener = l; }
這裡,我找到一個不錯的教程,能讓我們更好的理解:用代碼,類比註冊事件監聽器
先寫一個監聽器介面
package com.listener; /** * 點擊監聽器介面 */ public interface MyOnClickListener { public void onClick(); }
寫一個我們自己的Button類,實現點擊效果。
package com.listener; ` public class MyButton { private MyOnClickListener listener; /** * 設定具體點擊監聽器 * @param listener 點擊監聽器實作類別 */ public void setOnClickListener(MyOnClickListener listener) { this.listener = listener; } /** * 按鈕被點擊 */ public void doClick() { listener.onClick(); } }
最後類比Client端的註冊監聽器和觸發點擊操作。
package com.listener; publicclass Client { public static void main(String[] args) { MyButton button =new MyButton(); //註冊監聽器 button.setOnClickListener(new MyOnClickListener() { @Override public void onClick() { System.out.println("按鈕被點擊了"); } }); //類比使用者點擊 button.doClick(); } }
這個我看了有一會,感受一下還是有感覺的。http://blog.csdn.net/jason0539/article/details/10168899
它的評論我截了幾張圖片,還是有不錯的啟發的。
當然我在知乎也找到了神層級的回答,共用之。
好了,大概的瞭解後,我們可以繼續後續的學習了。
Android自學曆程—回呼函數的意思(源碼+例子)