摘要:下面說的是接口回調(diào)的理解,比較常用什么是回調(diào)函數(shù)有些庫函數(shù)要求應(yīng)用先傳給它一個(gè)函數(shù),在合適的時(shí)候調(diào)用,以完成目標(biāo)任務(wù)。
接口回調(diào)機(jī)制
java中的回調(diào)我認(rèn)為分為,同步回調(diào),異步回調(diào)1、什么是回調(diào)函數(shù)
回調(diào):其實(shí)就是,A調(diào)用B,B也調(diào)用A,
同步回調(diào):就是一種阻塞調(diào)用,A調(diào)用B的方法,等待B執(zhí)行完,A才繼續(xù)
異步回調(diào):類似打電話,A告訴B一聲,然后A,B 各自干各自的事情。
異步回調(diào)又可以是多線程,也可以是接口,我都按照異步來理解了。下面說的是接口回調(diào)的理解,比較常用
有些庫函數(shù)(library function)要求應(yīng)用先傳給它一個(gè)函數(shù),在合適的時(shí)候調(diào)用,以完成目標(biāo)任務(wù)。這個(gè)被傳入的、后又被調(diào)用的函數(shù)就稱為回調(diào)函數(shù)(callback function)2、上面鏈接中例子的理解就是:我找你幫忙help做一件事,我把做完應(yīng)該干啥的方法do()傳給你,,然后我調(diào)用請(qǐng)求你help()方法,告訴你開始做吧,然后你做了一堆,最后做完了應(yīng)該怎么辦,就是調(diào)用do();
上文中的接口回調(diào),理解為異步回調(diào),就是我想完成一件事,我不用自己做,我告訴別人一下,讓他去做,我自己可以去做別的事。
約定接口,計(jì)算完要做的事----這里就是填寫結(jié)果,具體填寫誰的? 填什么?怎么填,都是傳過來的。。。 誰要找我?guī)兔Γ愕媒o我傳個(gè)你得權(quán)限和信息,比如(我?guī)湍闾顚懡Y(jié)果,你告訴我怎么填,就是接口中這個(gè)方法,方法的具體實(shí)現(xiàn)規(guī)則是由 對(duì)方來完成)
public interface doJob { public void fillBlank(int a, int b, int result); }
計(jì)算方法,根據(jù)傳過來的值和對(duì)象,計(jì)算,計(jì)算完并根據(jù)約定,調(diào)用接口的方法做操作。
public class SuperCalculator { public void add(int a, int b, doJob customer) { int result = a + b; customer.fillBlank(a, b, result); } }
學(xué)生,找人幫忙計(jì)算,把數(shù)值 和 約定的實(shí)現(xiàn)方法傳過去,告訴他,這幾個(gè)數(shù),你給我計(jì)算,計(jì)算完按照我的方法給我填了
public class Student { private String name = null; public Student(String name) { // TODO Auto-generated constructor stub this.name = name; } public void setName(String name) { this.name = name; } public class doHomeWork implements doJob { @Override public void fillBlank(int a, int b, int result) { // TODO Auto-generated method stub System.out.println(name + "求助小紅計(jì)算:" + a + " + " + b + " = " + result); } } public void callHelp (int a, int b) { new SuperCalculator().add(a, b, new doHomeWork()); } }
小販,找人幫忙,告訴你數(shù)值和,具體計(jì)算完應(yīng)該怎么寫的方法,計(jì)算完按照這個(gè)方法幫我填了
public class Seller { private String name = null; public Seller(String name) { // TODO Auto-generated constructor stub this.name = name; } public void setName(String name) { this.name = name; } public class doHomeWork implements doJob { @Override public void fillBlank(int a, int b, int result) { // TODO Auto-generated method stub System.out.println(name + "求助小紅算賬:" + a + " + " + b + " = " + result + "元"); } } public void callHelp (int a, int b) { new SuperCalculator().add(a, b, new doHomeWork()); } }
public class Test { public static void main(String[] args) { int a = 56; int b = 31; int c = 26497; int d = 11256; Student s1 = new Student("小明"); Seller s2 = new Seller("老婆婆"); s1.callHelp(a, b); s2.callHelp(c, d); } }
所謂回調(diào),就是a調(diào)b,b也會(huì)調(diào)a
最后的結(jié)果是: 學(xué)生給了你數(shù)值,和怎么填寫,,然后你計(jì)算完,用學(xué)生的對(duì)象調(diào)用了下方法,把數(shù)值傳進(jìn)去,填寫。這是所謂的回調(diào),具體我怎么填寫的,這個(gè)方法時(shí)學(xué)生是寫約定接口自己實(shí)現(xiàn)的,他傳過來了,告訴你了,所以調(diào)用方法以后,按照你傳入的數(shù)值做了回調(diào),實(shí)現(xiàn)了學(xué)生約定的操作。
舉個(gè)例子:比如recyclerview 的點(diǎn)擊事件,,如果我想在外層做點(diǎn)擊事件,這個(gè)時(shí)候就必須拿到點(diǎn)擊的id.但是 recyclerview的點(diǎn)擊事件實(shí)在 adapter中實(shí)現(xiàn)的。。所以可以用接口回調(diào)來實(shí)現(xiàn),把點(diǎn)擊位置回調(diào)返回,在外層做操作。。
但是我們可以這樣理解:我要在外層做點(diǎn)擊事件,但我做不了,怎么辦?我請(qǐng)求內(nèi)層幫我做,我告訴他我點(diǎn)擊了要做啥就行了。這樣我屬于異步回調(diào),我就是告訴你一聲,然后我就該干嘛干嘛去了。
1、請(qǐng)求幫助,需要一個(gè)幫助方法讓我來調(diào)用,我要傳值為(我要點(diǎn)擊后做的事,傳一個(gè)對(duì)象過去)
2、所以這就需要定義一個(gè)接口,約定好方法,然后再內(nèi)層創(chuàng)建這個(gè)幫助方法
3、然后就是內(nèi)層按照我的要求,去做相應(yīng)的點(diǎn)擊事件了。
所以,接下來我們一步步的去實(shí)現(xiàn):
1、約定一個(gè)接口(實(shí)現(xiàn)一個(gè)點(diǎn)擊方法,具體怎么實(shí)現(xiàn)由外層決定,完成后傳過來)
public interface onMyClick{ void setMyclick(int position); //有個(gè)位置參數(shù),是因?yàn)橥鈱訉?shí)現(xiàn)這個(gè)方法規(guī)則的時(shí)候要用到 }
2、adapter中定義一個(gè) 設(shè)置監(jiān)聽的方法讓外層調(diào)用
//聲明onMyclick對(duì)象是因?yàn)榻酉聛恚鈱诱{(diào)用了這個(gè)方法我要用傳過來的onMyClick去做操作,去調(diào)用setMyclick(),來實(shí)現(xiàn)定義的具體操作 onMyClick onMyClick; public void setOnMyClick(onMyClick onMyClick){ this.onMyClick =onMyClick; }
3、外部調(diào)用監(jiān)聽方法,傳入操作規(guī)則,也就是實(shí)現(xiàn)定義的接口方法的具體
adapter.setOnMyClick(new MyAdapter.onMyClick() { @Override public void setMyclick(int position) { Log.d("測(cè)試","接口回調(diào)"); } });
4、adapter內(nèi)部點(diǎn)擊事件的監(jiān)聽
holder.view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d("測(cè)試","正常點(diǎn)擊事件"); if (onMyClick!=null){ onMyClick.setMyclick(position); } } });
注意:上面的順序是我按照理解的過程寫的,寫的時(shí)候順序不一定是這樣。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/68729.html
摘要:異步調(diào)用異步調(diào)用是為了解決同步調(diào)用可能出現(xiàn)阻塞,導(dǎo)致整個(gè)流程卡住而產(chǎn)生的一種調(diào)用方式。回調(diào)是一種思想是一種機(jī)制,至于具體如何實(shí)現(xiàn),如何通過代碼將回調(diào)實(shí)現(xiàn)得優(yōu)雅實(shí)現(xiàn)得可擴(kuò)展性比較高,一看開發(fā)者的個(gè)人水平,二看開發(fā)者對(duì)業(yè)務(wù)的理解程度。 模塊間調(diào)用在一個(gè)應(yīng)用系統(tǒng)中,無論使用何種語言開發(fā),必然存在模塊之間的調(diào)用,調(diào)用的方式分為幾種: (1)同步調(diào)用 showImg(https://segmen...
摘要:回調(diào)是一種雙向的調(diào)用模式,也就是說,被調(diào)用的接口被調(diào)用時(shí)也會(huì)調(diào)用對(duì)方的接口,例如要調(diào)用,在執(zhí)行完又要調(diào)用。詳細(xì)的代碼如下創(chuàng)建一個(gè)回調(diào)接口創(chuàng)建回調(diào)接口的實(shí)現(xiàn)類,此例中,員工干完活后還要干什么事情是老板說了算的。 什么是回調(diào)? 如上一篇文章所說,從調(diào)用方式上看,可以分為三類同步調(diào)用、異步調(diào)用和回調(diào)。回調(diào)是一種雙向的調(diào)用模式,也就是說,被調(diào)用的接口被調(diào)用時(shí)也會(huì)調(diào)用對(duì)方的接口,例如A要調(diào)用B,...
摘要:回調(diào)函數(shù)異步回調(diào)簡(jiǎn)明講解敘言異步回調(diào)常用于某些業(yè)務(wù)需要很長(zhǎng)時(shí)間處理,但是又需要立刻返回結(jié)果,這種情況都需要開辟線程獨(dú)立處理需要長(zhǎng)時(shí)間多的業(yè)務(wù),也無處理完了,回調(diào)回調(diào)函數(shù),再去處理與之有關(guān)的需要在該業(yè)務(wù)之后處理的業(yè)務(wù)。 java回調(diào)函數(shù)-異步回調(diào)-簡(jiǎn)明講解 敘言: 異步回調(diào)常用于某些業(yè)務(wù)需要很長(zhǎng)時(shí)間處理,但是又需要立刻返回結(jié)果,這種情況都需要開辟線程獨(dú)立處理需要長(zhǎng)時(shí)間多的業(yè)務(wù),也無處理...
摘要:原文地址游客前言金三銀四,很多同學(xué)心里大概都準(zhǔn)備著年后找工作或者跳槽。最近有很多同學(xué)都在交流群里求大廠面試題。 最近整理了一波面試題,包括安卓JAVA方面的,目前大廠還是以安卓源碼,算法,以及數(shù)據(jù)結(jié)構(gòu)為主,有一些中小型公司也會(huì)問到混合開發(fā)的知識(shí),至于我為什么傾向于混合開發(fā),我的一句話就是走上編程之路,將來你要學(xué)不僅僅是這些,豐富自己方能與世接軌,做好全棧的裝備。 原文地址:游客kutd...
閱讀 3528·2021-11-18 10:02
閱讀 3103·2019-08-29 18:34
閱讀 3389·2019-08-29 17:00
閱讀 420·2019-08-29 12:35
閱讀 747·2019-08-28 18:22
閱讀 1910·2019-08-26 13:58
閱讀 1659·2019-08-26 10:39
閱讀 2668·2019-08-26 10:11