安卓回撥函式解決不同類之間函式呼叫和資料通訊的問題
歡迎轉載,請註明轉載自安卓訂閱號(安卓程式設計入門進階)。
安卓回撥函式的意義:
安卓中其實隨處可見回撥函式,使用者在手機上執行的大部分操作都會產生一個回撥事件,例如Button點選,listView的點選等。這些控制元件的回撥函式都已經在安卓系統中內建寫好,程式設計師使用上面的成熟控制元件只需要編寫回調函式部分,即回撥事件實際執行的部分。但是編寫安卓程式不可避免的需要一些執行緒之類的特性。如上一節課程,如果執行緒是直接在MainActivity中初始化的,那麼可以使用handler將資料傳遞到UI程序,但很明顯,隨著程式的功能增多,把所有的執行緒全部定義到MainActivity中很不現實。如果新建一個執行緒類,就需要解決執行緒類把結果實時通知到主執行緒並重新整理UI的問題,安卓的回撥機制就可以很好的解決此問題。回撥的解釋網上很多(如
注意:雖然回撥函式的函式體是在MainActivity.java中,但是這部分函式的執行還是屬於子執行緒,如果要使用此資料重新整理UI執行緒,還是需要使用handler(參見上一節課程)。
1、 建立一個空的工程,名為LearnCallback。
2、 在xml介面上新增一個button控制元件ID=btnStart用於啟動子執行緒,再新增一個TextView控制元件ID=tvOut用於顯示每秒產生的日期和時間輸出。
3、 在MainActivity.java中為兩個xml控制元件新增初始化。並設定button的監聽事件。
4、 在包名上右鍵新建一個新的介面命名為CallBackMain,在類中新增一個CallbacktoMain方法引數為字串型別用於傳遞字串,結束。
5、在包名上右鍵新建一個新的類命名為B,繼承自Thread類。宣告一個CallBackMain物件,在類中新增一個SetCallback函式,引數為CallBackMain物件,函式體中將執行緒類中的CallBackMain物件指向傳進來的引數。
6、在子執行緒中重寫run方法,在run方法中初始化日期和時間格式,每秒鐘獲取一次日期字串,然後呼叫執行緒類中CallBackMain物件的CallBackMain方法,將日期作為引數傳遞到MainActivity。
7、在MainActivity宣告B類的物件,然後呼叫B的SetCallBack方法,引數中直接初始化CallBackMain物件,重寫CallBacktoMain方法。
8、MainActivity中生命一個handler物件,重寫handleMessage方法,在CallBacktoMain的回撥函式中初始化bundle物件,將回調函式的引數寫入bundle,初始化一個message物件,將bundle裝入msg中,使用handler的sendMessage方法送到主執行緒,在handleMessage中使用TextView控制元件顯示最新的日期。
更多最新安卓程式設計資料請關注微信公眾號:安卓程式設計入門進階