標籤:方法 null statistic rac back etc param 特定 boolean
1、引子
android中的回調最經典的就是點擊事件設定監聽(一般通過switch(v.getId()))這裡寫個最主要的
btn_rigister.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // TODO log in }});
view對外暴露了一個介面onClick
public interface OnClickListener { /** * Called when a view has been clicked. * * @param v The view that was clicked. */ void onClick(View v); }
我們在用的時候實現詳細方法寫了處理時,當前的Actvity是沒有對這種方法做不論什麼操作,這個被充實之後的onClick方法被view回調處理!
當中一段處理 比方
public boolean callOnClick() { ListenerInfo li = mListenerInfo; if (li != null && li.mOnClickListener != null) { li.mOnClickListener.onClick(this); return true; } return false; }
詳細能夠閱讀View.java
2、什麼是回調
回調事實上是一種雙向調用模式,也就說調用方在介面被調用時也會調用對方的介面,聽起來就非常拗口,翻譯翻譯就是“實現了抽象類別/介面 的執行個體實現了父類的提供的抽象方法。後。將該方法交還給父類來處理”。口訣念3遍,能夠體會到當中的內涵了沒?
主要要弄清楚一點,實現方法交還給提供介面的父類處理。
3、為什麼要用回調
這裡體現了java物件導向的“萬事萬物皆為對象”。我們須要將普通物體的特性抽象出來。共性之中又有特性,每一個不同的特性就須要交給特定的情況處理,通過暴露介面方法能夠降低非常多反覆。代碼更加優雅。
比方view具有被點擊的通性,可是每一個點擊又會產生不一樣的事件處理一樣,因此android對外暴露一個介面有個onClick方法。你須要處理啥你就寫啥,view僅僅會調用這種方法,詳細怎麼處理你已經自己為不同的點擊事件做了處理了。
4、怎樣寫
一個非常好的小栗子
【定義介面】 在類中定義一個Interface, 並在介面中定義一個抽象方法
public interface Callback{ public abstract void work(); }
【介面對象】在類中定義一個該介面的成員變數
private Callback mCallback;
【設定對象】在類中定義一個公用方法,能夠設定這個介面的對象,調用該方法給介面物件變數賦值
public void setCallback(Callback callback) { this.mCallback = callback; }
【調用方法】調用介面對象中的方法
public void doWork() { mCallback.work(); }
ok,
完整代碼例如以下
public class Employee { /* * 定義回調介面的成員變數 */ private Callback mCallback; /* * 聲明回調介面 */ public interface Callback{ public abstract void work(); } /* * 設定回調介面對象成員變數 */ public void setCallback(Callback callback) { this.mCallback = callback; } /* * 調用回調介面對象中的方法 */ public void doWork() { mCallback.work(); } }
然後我們針對去使用就好
public class Boss { private Employee employee; /* * 為Employee設定回呼函數, 在這裡定義詳細的回調方法 */ public void setCallback() { employee.setCallback(new Employee.Callback() { @Override public void work() { System.out.println("work"); } }); } }
android中的回調