前言:關於Java中的回調一直是困擾着我的一個問題,雖然感覺好像沒什麼好說的,但是作爲強迫症患者,就會深究其中無法自拔。例如:爲什麼要回調?回調和委派是什麼關係?感覺要實現委派,回調似乎是少不了的。那麼Android中的事件處理委派機制和回調機制的區別究竟是什麼?接下來就來研究一下Java中的回調吧。
一、什麼是回調?
二、爲什麼要引入回調?
三、接口回調的實例和原理。
package test;
public class Service {
private Callback mCallback;
/**
* 在服務端定義一個回調接口
*/
public interface Callback {
void callbackFunction();
}
/**
* 客戶端初始化時需要傳入一個Callback接口的實現類。
*
* @param mCallback
* 相當於客戶端拋給服務端的“鉤子”,服務端將通過這個“鉤子”實現回調。
*/
public Service(Callback mCallback) {
this.mCallback = mCallback;
}
/**
* 服務端提供給客戶端的服務
*/
public void startThinking() {
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("I'm thinking!!!:" + i);
}
System.out.println("Service done!");
// 回調客戶端的回調函數,mCallback是客戶端傳過來的“鉤子”
mCallback.callbackFunction();
}
}
接着是客戶端的代碼:
package test;
import test.Service.Callback;
public class Client {
public static void main(String args[]) {
Callback mCallback = new Callback() {
@Override
public void callbackFunction() {
System.out.println("Back to client!");
}
};
//這裏相當於將接口的實現類傳給了服務端,提供了服務端回調的一個“鉤子”
Service mCallee = new Service(mCallback);
//請求服務端的服務,相當於例子中小明打電話問小王的過程,接下來就只要等小王打回來就行了(回調)
mCallee.startThinking();
}
}
執行結果:
小結:從上面可以看出,這種回調是基於接口的一種回調,客戶端將接口的實現類(“鉤子”)丟給服務端,服務端做完事情之後這個“鉤子”使回調成爲可能,通過“鉤子”回調了客戶端代碼。
大致原理如圖: