java回調函數這樣說,應該明確了吧!
有哥們問我回調怎麽用,回調怎麽理解?
怎麽說好呢,僅僅可意會不可言傳吶,非也,回調在實際開發中使用頻率事實上是非常高的,恰好我小時候也被回調函數欺負過,居然問了,那麽肯定要好好分享一下我的一些經驗.
網傳回調的理解
所謂的回調函數就是:在A類中定義了一個方法。這種方法中用到了一個接口和該接口中的抽象方法,可是抽象方法沒有詳細的實現,須要B類去實現。B類實現該方法後。它本身不會去調用該方法。而是傳遞給A類,供A類去調用。這樣的機制就稱為回調。
預計看完已經暈在廁所了,能夠臨時忽略…
那麽從如今開始能夠先用我的三要素來理解,之前的能夠臨時忘記.
回調我這邊總結了有三要素:
- 接口:
哪裏須要被監聽
,接口就寫在那裏. - 引用: 要有引用才幹夠
對被監聽者進行設置監聽
. - 實現:
哪裏須要數據/結果
,就在那裏進行實現
銷售賣機器的樣例
一個銷售向工人訂了100臺機器準備賣給老外,讓工人在生產完100臺機器後通知下他.
對於這個需求我們能夠用回調監聽
來處理
我們先縷一縷思路:
在這個需求裏,我們用剛剛的三要素定位下.
- 哪裏須要被監聽 -> 工人 (監聽工人工作進度)
- 哪裏須要結果 -> 銷售 (得到工人生產的結果)
- 對被監聽者進行設置監聽 -> 銷售 (由於結果終於在銷售類裏獲得,因此設置監聽要在這裏)
我們來看看以下的代碼:
工人類須要對生產機器的進去進行監聽.
/**
* 工人類
* 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回調函數這樣說,應該明確了吧!