Android 回調(diào)詳解及簡(jiǎn)單實(shí)例
Android 回調(diào)
前言:
Android中的回調(diào)最經(jīng)典的就是點(diǎn)擊事件設(shè)置監(jiān)聽(一般通過switch(v.getId()))這里寫個(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)具體方法寫了處理時(shí),當(dāng)前的Actvity是沒有對(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)用模式,也就說調(diào)用方在接口被調(diào)用時(shí)也會(huì)調(diào)用對(duì)方的接口,聽起來就很拗口,翻譯翻譯就是“實(shí)現(xiàn)了抽象類/接口 的實(shí)例實(shí)現(xiàn)了父類的提供的抽象方法,后,將該方法交還給父類來處理”,口訣念3遍,可以體會(huì)到其中的內(nèi)涵了沒?
主要要弄清楚一點(diǎn),實(shí)現(xiàn)方法交還給提供接口的父類處理!
3、為什么要用回調(diào)
這里體現(xiàn)了Java面向?qū)ο蟮摹叭f事萬物皆為對(duì)象”,我們需要將普通物體的特性抽象出來,共性之中又有特性,每個(gè)不同的特性就需要交給特定的情況處理,通過暴露接口方法可以減少很多重復(fù),代碼更加優(yōu)雅。
比如view具有被點(diǎn)擊的通性,但是每個(gè)點(diǎn)擊又會(huì)產(chǎn)生不一樣的事件處理一樣,因此android對(duì)外暴露一個(gè)接口有個(gè)onClick方法,你需要處理啥你就寫啥,view只會(huì)調(diào)用這個(gè)方法,具體怎么處理你已經(jīng)自己為不同的點(diǎn)擊事件做了處理了。
4、如何寫
一個(gè)很好的小栗子
【定義接口】 在類中定義一個(gè)Interface, 并在接口中定義一個(gè)抽象方法
public interface Callback{
public abstract void work();
}
【接口對(duì)象】在類中定義一個(gè)該接口的成員變量
private Callback mCallback;
【設(shè)置對(duì)象】在類中定義一個(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ì)本站的支持!
- Android中Fragment多層嵌套時(shí)onActivityResult無法正確回調(diào)問題的解決方法
- Android 的回調(diào)事件詳解
- Android異步回調(diào)中的UI同步性問題分析
- Android的Fragment的生命周期各狀態(tài)和回調(diào)函數(shù)使用
- 深入淺析Android接口回調(diào)機(jī)制
- 理解Android中Activity的方法回調(diào)
- android自定義控件和自定義回調(diào)函數(shù)步驟示例
- 詳細(xì)介紹Android中回調(diào)函數(shù)機(jī)制
- Android中回調(diào)接口的使用介紹
- 基于Android中Webview使用自定義的javascript進(jìn)行回調(diào)的問題詳解
相關(guān)文章
Android RecycleView實(shí)現(xiàn)Item拖拽效果
RecyclerView是Android一個(gè)更強(qiáng)大的控件,其不僅可以實(shí)現(xiàn)和ListView同樣的效果,還有優(yōu)化了ListView中的各種不足。本文將介紹通過RecyclerView實(shí)現(xiàn)Item拖拽效果以及拖拽位置保存,感興趣的可以參考一下2022-01-01
Android 中解決Viewpage調(diào)用notifyDataSetChanged()時(shí)界面無刷新的問題
這篇文章主要介紹了Android 中解決Viewpage調(diào)用notifyDataSetChanged()時(shí)界面無刷新的問題的相關(guān)資料,這里提供相應(yīng)的解決辦法,需要的朋友可以參考下2017-08-08
Android實(shí)現(xiàn)ListView控件的多選和全選功能實(shí)例
這篇文章主要介紹了Android實(shí)現(xiàn)ListView控件的多選和全選功能,結(jié)合實(shí)例形式分析了ListView控件多選及全選功能的布局與功能實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-07-07
Android中使用findViewByMe提升組件查找效率
本文主要介紹了Android中使用findViewByMe提升組件查找效率的相關(guān)知識(shí)。具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-03-03
Android編程實(shí)現(xiàn)小說閱讀器滑動(dòng)效果的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)小說閱讀器滑動(dòng)效果的方法,涉及onTouch事件滑動(dòng)效果的相關(guān)實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
Android Fragment實(shí)現(xiàn)底部通知欄
這篇文章主要為大家詳細(xì)介紹了Android Fragment實(shí)現(xiàn)底部通知欄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07
iOS開發(fā)中TableView類似QQ分組的折疊與展開效果
這篇文章主要介紹了iOS開發(fā)中TableView類似QQ分組的折疊與展開效果,其實(shí)要做這個(gè)效果我先想到的是在tableView中再嵌套多個(gè)tableView。下面通過本文給大家分享實(shí)現(xiàn)思路,需要的朋友可以參考下2016-12-12

