1. 程式人生 > >java回調函數這樣說,應該明確了吧!

java回調函數這樣說,應該明確了吧!

param private 這樣的 ng- println over ide 滿足 總結

有哥們問我回調怎麽用,回調怎麽理解?

怎麽說好呢,僅僅可意會不可言傳吶,非也,回調在實際開發中使用頻率事實上是非常高的,恰好我小時候也被回調函數欺負過,居然問了,那麽肯定要好好分享一下我的一些經驗.

網傳回調的理解
所謂的回調函數就是:在A類中定義了一個方法。這種方法中用到了一個接口和該接口中的抽象方法,可是抽象方法沒有詳細的實現,須要B類去實現。B類實現該方法後。它本身不會去調用該方法。而是傳遞給A類,供A類去調用。這樣的機制就稱為回調。

預計看完已經暈在廁所了,能夠臨時忽略…

那麽從如今開始能夠先用我的三要素來理解,之前的能夠臨時忘記.
回調我這邊總結了有三要素:

  1. 接口: 哪裏須要被監聽,接口就寫在那裏.
  2. 引用: 要有引用才幹夠對被監聽者進行設置監聽.
  3. 實現: 哪裏須要數據/結果,就在那裏進行實現

銷售賣機器的樣例

一個銷售向工人訂了100臺機器準備賣給老外,讓工人在生產完100臺機器後通知下他.

對於這個需求我們能夠用回調監聽來處理

我們先縷一縷思路:
在這個需求裏,我們用剛剛的三要素定位下.

  1. 哪裏須要被監聽 -> 工人 (監聽工人工作進度)
  2. 哪裏須要結果 -> 銷售 (得到工人生產的結果)
  3. 對被監聽者進行設置監聽 -> 銷售 (由於結果終於在銷售類裏獲得,因此設置監聽要在這裏)

我們來看看以下的代碼:
工人類須要對生產機器的進去進行監聽.

/**
 * 工人類
 * 1. 僅僅要負責生產
 * 2. 生產完之後告訴經理
 * @author relicemxd
 *
 */
public class Worker {
    private WorkListner listner;

  /**
     * 制造機器:
     * 工人特有的方法
     */
    public void makeMachine() {
        int num = 100;
        for (int i = 0; i < num; i++) {
            if
(num >= 50) { continue; } } // 滿足100臺機器,通知能夠進行下一步操作 listner.onWorkListner(num); } /* * 監聽工人生產情況的接口 */ public interface WorkListner { //對滿足條件後,進行事件操作的方法 void onWorkListner(int num); } /** * 設置監聽工人生產情況的方法 * @param listner 接扣要在需求方被實現 */ public void setOnWorkListner(WorkListner listner) { this.listner = listner; } }

上面要對工人的工作情況進行觀察,因此WorkListner接口和setOnWorkListner(WorkListner listner)設置監聽的方法就寫在Worker工人類.

再繼續看以下代碼:
銷售須要設置監聽,才知道工人幾時才生產完機器.

/**
 * 銷售僅僅要負責賣就能夠了
 * 
 * @author relicemxd
 *
 */
public class Seller {
    public static void main(String[] args) {
        //1. 銷售要賣機器首先要有機器,誰生產機器?  找到工人
        Worker work = new Worker();

        //2. 銷售要賣多少臺機器?  告訴工人
        work.setOnWorkListner(new WorkListner() {
            @Override
            public void onWorkListner(int num) {
                System.out.println("如今已經生產完畢,共 "+num +" 臺機器");

                //當工人生產完畢後就能夠賣機器了
                sell();
            }
        });

        //3. 工人明白要生產多少臺機器後就能夠開幹了.   讓工人生產100臺機器
        work.makeMachine();
    }


    /**
     * 賣機器:
     * 僅僅有銷售才有的方法
     */
    private static void sell() {
        System.out.println("銷售開始賣機器給老外了...");
    }
}

要想知道機器的進度情況,那麽就肯定要有new Worker()工人對象,此時有了工人的引用,接著要什麽需求就吩咐工人(做100臺機器)並告之工人做完給反饋work.setOnWorkListner(listner),工人開始按需求做機器了work.makeMachine(),做完後就會進行反饋回調,告之銷售能夠拿去賣了onWorkListner(int num) { TODO }

假設還有疑惑的繼續看android中的常見回調點擊事件

我眼下所見過的回調都是在一個特定的條件下才發生的方法回調(比如按鈕的onClick();最常見)

我先分析下要做實事的是不是相應的activity/fragment或者adapter裏,須要被監聽觀察是否有點擊狀態的是否就Button.

好我知道來來龍去脈後,用三要素蘇通下:

  • 接口: Button
    在源代碼中能夠看到,設置監聽的方法寫在Button裏類,而OnClickListener寫在Button的父類View裏.
public void setOnClickListener(@Nullable OnClickListener l) {?
  if (!isClickable()) {?
     setClickable(true);?
  }?
  getListenerInfo().mOnClickListener = l;?
}
  • 實現和引用
    activity裏,當點擊了button後,我須要打開一個頁面MainActivity,因此button的應用和setOnClickListener(listner)方法都寫在了這個activity裏.
button.setOnClickListener(new OnClickListener() {?
@Override?
public void onClick(View v) {?
  mActivity.startActivity(new Intent(mActivity, MainActivity.class));?
}});

java回調函數這樣說,應該明確了吧!