1. 程式人生 > >通俗易懂的讓你徹底明白介面回撥機制

通俗易懂的讓你徹底明白介面回撥機制

轉載請註明出處:flowsky37的部落格,尊重他人辛苦勞動!
介面回撥簡單理解就是:類A中呼叫B類的中方法C,而B又反過去呼叫A中的方法D,然後D稱為A的回撥方法。是不是心中有一萬隻草泥馬在奔騰,到底說的是什麼。感覺像是你中有我,我中有你,糾纏不清。
舉個通俗易懂的例子,比如顧客是A,廚師是B。麵粉是介面Callback。然後麵粉的吃法D是在顧客A的手中,廚師B有包子的做法C。現在需求是A有面粉,想吃包子,但是A是不會做包子,就需要去找廚師,讓他調方法C做包子,A就把麵粉Callback給了廚師,至於廚師怎麼做,A不管,A只要你做好了給我一個結果(包子)就OK了。至於包子怎麼吃,我是直接吃,還是蘸點醋吃,那是A的事了(A怎麼吃的過程就是方法D裡具體執行的程式碼)。
下面結合一個簡單的例子看就容易多了。
首先是定義介面(麵粉):

package com.example.interfacecallbackdemo;
public interface Callback {
    //因為是一堆麵粉,肯定是沒法吃的,所以沒有具體的方法體,俗稱“吃法”
    public void D(String result);
}
然後定義A類(客戶):
package com.example.interfacecallbackdemo;
public class A implements Callback{
    /**
     * B類引用
     */
    private B b;
    public A(B b) {
        this
.b = b; } /** * A類通過該方法呼叫B的方法C(可理解為找到廚師並將麵粉給他)。 */ public void selectMenu(){ b.C(this); } /** * A類中的D方法,也稱為A類的回撥方法(廚師做好包子將包子(result)返回給顧客A) */ @Override public void D(String result) { System.out.print(result); } }
然後是B類:
package com.example.interfacecallbackdemo;
public
class B { /** * B類的C方法(接受麵粉Callback,然後開工做包子,做好後返回給客戶A)。 */ public void C(Callback callback){ String result = "2"; callback.D(result); } }
再加上一個執行的物件,我是利用android中button呼叫的:
package com.example.interfacecallbackdemo;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity implements OnClickListener{
    private A a;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.btn_main)
        .setOnClickListener(this);
        a = new A(new B());
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.btn_main:
            a.selectMenu();
            break;
        default:
            break;
        }

    }
}

(ABCD分別對應什麼自己腦補,很easy吧)前面說的是A 呼叫B中的方法C,B又反過來呼叫A中的方法D。在程式碼中我就直接用ABCD ,簡單、直接、粗暴。
但是,B類的C方法的引數不必一定要把Callback作為引數,如果C方法中沒有這個引數,那在B類中一定要在其它地方把Callback接收進來。比如,我把B類稍微改動一下:

package com.example.interfacecallbackdemo;
public class B {
    private Callback callback;

    public B(Callback callback){
        this.callback = callback;
    }
    /**
     * B類的C方法
     */
    public void C(){
        String result = "2";
        callback.D(result);
    }
}

此時A類也要做相應的調整:

package com.example.interfacecallbackdemo;
import android.util.Log;
public class A {
    /**
     * B類引用
     */
    private B b;

    /**
     * A類同過該方法呼叫B類的C方法
     */
    public void selectMenu(){
        b = new B(new Callback() {

            @Override
            public void D(String result) {
                System.out.print(result);               
            }
        });
        b.C();
    }
}

呃,這個算是標準版的變異版,其實也是很簡單的,畢竟這種可能是大家專案中實際中會見到而不至於弄不清楚,但是有一點,C方法中一定會有介面的例項物件呼叫其抽象方法。其實我們不需要按介面回撥的定義去對比,重要的是理解其原理機制,只需記住,哪個類傳遞Callback例項物件過去的,就是我們所說的A,接受的就是B。
介面回撥在android中是非常常見的,典型的就是各種監聽器了,如果去分析下原始碼,你就會發現跟上面得那個例子大同小異。
上面是個人對介面回撥的一些理解,如果有不明白的,可以留言;如果某些地方有誤,非常歡迎指出,謝謝!**

相關推薦

通俗易懂徹底明白介面機制

轉載請註明出處:flowsky37的部落格,尊重他人辛苦勞動! 介面回撥簡單理解就是:類A中呼叫B類的中方法C,而B又反過去呼叫A中的方法D,然後D稱為A的回撥方法。是不是心中有一萬隻草泥馬在奔騰,到底說的是什麼。感覺像是你中有我,我中有你,糾

一個經典的例子徹底理解Java機制

以前不理解什麼叫回調,天天聽人家說加一個回撥方法啥的,心裡想我草,什麼叫回調方法啊?然後自己就在網上找啊找啊找,找了很多也不是很明白,現在知道了,所謂回撥:就是A類中呼叫B類中的某個方法C,然後B類中反過來呼叫A類中的方法D,D這個方法就叫回調方法,這樣子說你是不是有點暈暈的,其實我剛開始也是這樣不理解,

徹底明白JAVA中堆與棧的區別

java程序 運行 一點 動態 自動變 key 空間 類型 lin 原文地址:http://www.2cto.com/kf/201302/190704.html 簡單的說: Java把內存劃分成兩種:一種是棧內存,一種是堆內存。 在函數中定義的一些基本類型的變量和對象的引用

[精]--這一次,徹底明白Java的值傳遞和引用傳遞!

本文旨在用最通俗的語言講述最枯燥的基本知識 學過Java基礎的人都知道:值傳遞和引用傳遞是初次接觸Java時的一個難點,有時候記得了語法卻記不得怎麼實際運用,有時候會的了運用卻解釋不出原理,而且坊間討論的話題又是充滿爭議:有的論壇帖子說Java只有值傳遞,有的部落格說兩者皆有;這讓人有點摸不著頭

8句話徹底明白什麼是大資料營銷

這個時代搞營銷就像是在做一道未知口味的超級大蛋糕,而營銷手段就好比不同的口味的配料,隨著個人的喜好不同,配出的味道也將會不一樣,但這個蛋糕終歸是要拿到桌面上去品嚐,所以在海量的人群資訊中如何具有針對性的讓潛在客戶看見並接受呢? 答案就是大資料的運用。隨著移動網際網路的發展和移動智慧裝置軟硬體功能的不斷完善,

8句話徹底明白什麽是大數據營銷

合作 信息部 制造 提升 威脅 都是 產品 ado tex 這個時代搞營銷就像是在做一道未知口味的超級大蛋糕,而營銷手段就好比不同的口味的配料,隨著個人的喜好不同,配出的味道也將會不一樣,但這個蛋糕終歸是要拿到桌面上去品嘗,所以在海量的人群信息中如何具有針對性的讓潛在客戶看

WeCode線上少兒程式設計|徹底明白什麼才是真正的少兒程式設計?

少兒程式設計,通常指的是少兒程式設計教育。少兒程式設計教育是通過程式設計遊戲啟蒙、視覺化圖形程式設計等課程,培養學生的計算思維和創新解難能力的課程。少兒程式設計教育並不是要培養未來的程式設計師,而是讓孩子能掌握新科技並應用新科技表達自己,由科技時代的消費者轉變為創造者;同時,少兒程式設計是培養小朋友

C#之徹底明白物件,類,例項化的區別及聯絡

一、前言 在學習類的時候我們肯定離不開物件,它們之間的關係是非常緊密的,要想知道類那麼就一定要知道物件,從物件入手慢慢向類延申,讓你徹底明白類物件和類的聯絡又明白他們的區別。 二、物件和類 物件和類的區別 1,類是一個抽象的概念,它不存在於現實中的時間/空間裡,類只是為所有的物件

徹底明白p++,*(p++)等 經典例子:char str []="Orange or Apple?";徹底明白p++,*(p++)等

總體來說,對於char型別 的指標是 比較特別的: p++就是指標的移位,cout<<*p:就是取出指標當前值得元素cout<<p:就是這個指標指向的全部字元; 例子: #include <iostream> using namesp

Android設計模式之一個例子徹底明白工廠模式(Factory Pattern)

提出疑問 這幾天研究工廠模式的時候,看到網上的一些文章中舉的例子我就很疑惑,我相信這也是許多人的疑惑:工廠模式的功能就是建立例項,我們建立例項直接new不就完了嗎,幹嘛還得再封裝一層工廠類,然後用工廠類再去new出這個例項?這不多此一舉嗎? 比如我看到這樣的

Android設計模式之一個例子徹底明白裝飾者模式(Decorator Pattern)

導讀 這篇文章中我不會使用概念性文字來說明裝飾者模式,因為通常概念性的問題都很抽象,很難懂,使得讀者很難明白到底為什麼要使用這種設計模式,我們設計模式的誕生,肯定是前輩們在設計程式的時候遇到了某種困難,為了避免這種苦難的發生,從而設計出來的這種設計模式,所以這

徹底明白什麼叫遊戲引擎(2)

二、引擎的進化     曾經有一段時期,遊戲開發者關心的只是如何儘量多地開發出新的遊戲並把它們推銷給玩家。儘管那時的遊戲大多簡單粗糙,但每款遊戲的平均開發週期也要達到8到10個月以上,這一方面是由於技術的原因,另一方面則是因為幾乎每款遊戲都要從頭編寫程式碼,造成了大量的重複勞動。漸漸地,一些有經驗的開發者

Android介面機制(有圖有真相,如果一直接觸介面,但是自己又一直理解不了,這篇文章會秒懂)

本人自己也經常在開發中遇到介面回撥機制,說來慚愧,雖然一直在用介面,但是隻是去複製別人的程式碼,一直弄不明白介面回撥的原理,甚至自己也努力去看了很多篇文章,幾乎看了所有的介面回撥的例子,什麼延時問答啊,孔融讓梨啊,都看了,例子都能背下來了,兩三個月了還沒理解。看來本人頭腦不

一個例子徹底明白原型物件和原型鏈

function Person () { this.name = 'John'; } var person = new Person(); Person.prototype.say = function() {

一篇文章徹底明白區塊鏈有哪些應用場景

    Ripple: 區塊鏈跨境支付與外匯結算系統   Ripple為銀行類金融機構提供跨境支付服務,希望取代環球同業銀行金融電訊協會(SWIFT)的跨境轉賬平臺,打造全球統一的網路金融傳輸協議;利用Ripple的跨賬本協議(Interledger Protocol),所有參與者都能看到同一個賬本,銀

一個例項徹底明白Activity的4種啟動模式

首先,我們得有一個概念,就是啟動的Activity都是放在相應的任務棧中。按Back鍵的時候Activity會從任務棧中返回,當任務棧為空時系統就會回收這個任務棧。 那麼我們為什麼需要這4中啟動模式呢?我們新建Activity的並在Androidmanifes

Async和Await如何簡化非同步程式設計,幾個例項徹底明白

部落格園 引言 C#5.0中async和await兩個關鍵字,這兩個關鍵字簡化了非同步程式設計,之所以簡化了,還是因為編譯器給我們做了更多的工作,下面就具體看看編譯器到底在背後幫我們做了哪些複雜的工作的。 同步程式碼存在的問題 對於同步的程式碼,大家

多角度徹底明白yield語法糖的用法和原理及在C#函數語言程式設計中的作用

如果大家讀過dapper原始碼,你會發現這內部有很多方法都用到了yield關鍵詞,那yield到底是用來幹嘛的,能不能拿掉,拿掉與不拿掉有多大的差別,首先上一段dapper中精簡後的Query方法,先讓大家眼見為實。 private static IEnumerable<T> Qu

深入LUA指令碼語言,徹底明白除錯原理

這是道哥的第008篇原創 ![](http://ql815naye.hn-bkt.clouddn.com/wechat-qrcode.png) ## 一、前言 上篇文章我們聊了[gdb的底層除錯機制](https://mp.weixin.qq.com/s/oY2pF5ilk8UCq09022Tt6w

通過Lua徹底明白函式

Lua回撥函式例項 local m = {} local list = {name="hello",age=12} m.call_back_fun_print = function(printID)