Android 回調(diào)
前言:
Android中的回調(diào)最經(jīng)典的就是點(diǎn)擊事件設(shè)置監(jiān)聽(tīng)(一般通過(guò)switch(v.getId()))這里寫(xiě)個(gè)最基本的
btn_rigister.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // TODO log in } }); view對(duì)外暴露了一個(gè)接口onClick
public interface OnClickListener { /** * Called when a view has been clicked. * * @param v The view that was clicked. */ void onClick(View v); } 我們?cè)谟玫臅r(shí)候?qū)崿F(xiàn)具體方法寫(xiě)了處理時(shí),當(dāng)前的Actvity是沒(méi)有對(duì)這個(gè)方法做任何操作,這個(gè)被充實(shí)之后的onClick方法被view回調(diào)處理!其中一段處理 比如
public boolean callOnClick() { ListenerInfo li = mListenerInfo; if (li != null && li.mOnClickListener != null) { li.mOnClickListener.onClick(this); return true; } return false; } 具體可以閱讀View.java
2、什么是回調(diào)
回調(diào)其實(shí)是一種雙向調(diào)用模式,也就說(shuō)調(diào)用方在接口被調(diào)用時(shí)也會(huì)調(diào)用對(duì)方的接口,聽(tīng)起來(lái)就很拗口,翻譯翻譯就是“實(shí)現(xiàn)了抽象類(lèi)/接口 的實(shí)例實(shí)現(xiàn)了父類(lèi)的提供的抽象方法,后,將該方法交還給父類(lèi)來(lái)處理”,口訣念3遍,可以體會(huì)到其中的內(nèi)涵了沒(méi)?
主要要弄清楚一點(diǎn),實(shí)現(xiàn)方法交還給提供接口的父類(lèi)處理!
3、為什么要用回調(diào)
這里體現(xiàn)了Java面向?qū)ο蟮摹叭f(wàn)事萬(wàn)物皆為對(duì)象”,我們需要將普通物體的特性抽象出來(lái),共性之中又有特性,每個(gè)不同的特性就需要交給特定的情況處理,通過(guò)暴露接口方法可以減少很多重復(fù),代碼更加優(yōu)雅。
比如view具有被點(diǎn)擊的通性,但是每個(gè)點(diǎn)擊又會(huì)產(chǎn)生不一樣的事件處理一樣,因此android對(duì)外暴露一個(gè)接口有個(gè)onClick方法,你需要處理啥你就寫(xiě)啥,view只會(huì)調(diào)用這個(gè)方法,具體怎么處理你已經(jīng)自己為不同的點(diǎn)擊事件做了處理了。
4、如何寫(xiě)
一個(gè)很好的小栗子
【定義接口】 在類(lèi)中定義一個(gè)Interface, 并在接口中定義一個(gè)抽象方法
public interface Callback{ public abstract void work(); } 【接口對(duì)象】在類(lèi)中定義一個(gè)該接口的成員變量
private Callback mCallback;
【設(shè)置對(duì)象】在類(lèi)中定義一個(gè)公共方法,可以設(shè)置這個(gè)接口的對(duì)象,調(diào)用該方法給接口對(duì)象變量賦值
public void setCallback(Callback callback) { this.mCallback = callback; } 【調(diào)用方法】調(diào)用接口對(duì)象中的方法
public void doWork() { mCallback.work(); } ok,
完整代碼如下
public class Employee { /* * 定義回調(diào)接口的成員變量 */ private Callback mCallback; /* * 聲明回調(diào)接口 */ public interface Callback{ public abstract void work(); } /* * 設(shè)置回調(diào)接口對(duì)象成員變量 */ public void setCallback(Callback callback) { this.mCallback = callback; } /* * 調(diào)用回調(diào)接口對(duì)象中的方法 */ public void doWork() { mCallback.work(); } } 然后我們針對(duì)去使用就好
public class Boss { private Employee employee; /* * 為Employee設(shè)置回調(diào)函數(shù), 在這里定義具體的回調(diào)方法 */ public void setCallback() { employee.setCallback(new Employee.Callback() { @Override public void work() { System.out.println("work"); } }); } } 感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
新聞熱點(diǎn)
疑難解答
圖片精選