深入淺析Android接口回調(diào)機(jī)制
在使用接口回調(diào)的時(shí)候發(fā)現(xiàn)了一個(gè)經(jīng)常犯的錯(cuò)誤,就是回調(diào)函數(shù)里面的實(shí)現(xiàn)有可能是用多線程或者是異步任務(wù)去做的,這就會(huì)導(dǎo)致我們期望函數(shù)回調(diào)完畢去返回一個(gè)主函數(shù)的結(jié)果,實(shí)際發(fā)現(xiàn)是行不通的,因?yàn)槿绻卣{(diào)是多線程的話你是無(wú)法和主函數(shù)同步的,也就是返回的數(shù)據(jù)是錯(cuò)誤的,這是非常隱秘的一個(gè)錯(cuò)誤。那有什么好的方法去實(shí)現(xiàn)數(shù)據(jù)的線性傳遞呢?先介紹下回調(diào)機(jī)制原理。
回調(diào)函數(shù)
回調(diào)函數(shù)就是一個(gè)通過函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)函數(shù),當(dāng)這個(gè)指針被用為調(diào)用它所指向的函數(shù)時(shí),我們就說這是回調(diào)函數(shù)?;卣{(diào)函數(shù)不是由該函數(shù)的實(shí)現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時(shí)由另外的一方調(diào)用的,用于對(duì)該事件或條件進(jìn)行響應(yīng)。
開發(fā)中,接口回調(diào)是我們經(jīng)常用到的。
接口回調(diào)的意思即,注冊(cè)之后并不立馬執(zhí)行,而在某個(gè)時(shí)機(jī)觸發(fā)執(zhí)行。
舉個(gè)例子:
A有一個(gè)問題不會(huì),他去問B,B暫時(shí)解決不出來(lái),B說,等我(B)解決了再告訴你(A)此時(shí)A可以繼續(xù)先做別的事情。
那么就只有當(dāng)B解決完問題后告訴A問題解決了,A才可以能解決這個(gè)問題。
代碼中比如最常用的:
一個(gè)Activity中給按鈕一個(gè)接口回調(diào)方法,只有用戶點(diǎn)擊了這個(gè)按鈕,告訴按鈕被點(diǎn)擊了,才會(huì)執(zhí)行按鈕接口回調(diào)的方法
Button btn = new Button(this); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { } });
那么下面通過一個(gè)Demo理解接口回調(diào):
主線程開啟一個(gè)異步任務(wù),當(dāng)異步任務(wù)接收到數(shù)據(jù),則把數(shù)據(jù)用TextView顯示出來(lái)
1、首先 我們需要定義一個(gè)接口,定義一個(gè)方法,參數(shù)為一個(gè)字符串:
package com.xqx.InterfaceDemo; public interface ChangeTitle { void onChangeTitle(String title); }
2、寫一個(gè)異步任務(wù),把接口作為構(gòu)造方法參數(shù),在doInBackground()方法中判斷如果有數(shù)據(jù),則接口回調(diào)
package com.xqx.InterfaceDemo; import android.content.Context; import android.os.AsyncTask; public class MyTask extends AsyncTask<String,Void,String>{ private ChangeTitle changeTitle; public MyTask(ChangeTitle changeTitle) { this.changeTitle = changeTitle; } @Override protected String doInBackground(String... strings) { if (strings[0]!=null){ changeTitle.onChangeTitle(strings[0]); } return null; } }
3、主Activity,給異步任務(wù)參數(shù)傳this,即 接口回調(diào)方法在此類中執(zhí)行,那么就需要實(shí)現(xiàn)ChangeTitle接口,重寫接口中
onChangeTitle 方法
package com.xqx.InterfaceDemo; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.TextView; public class MainActivity extends Activity implements ChangeTitle { private TextView textView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); textView = (TextView) findViewById(R.id.textView); new MyTask(this).execute("我是標(biāo)題"); } // 重寫接口方法,執(zhí)行相應(yīng)操作 @Override public void onChangeTitle(String title) { textView.setText(title); } }
以上內(nèi)容就是本文給大家分享的Android接口回調(diào)機(jī)制,感謝大家對(duì)腳本之家網(wǎng)站的關(guān)注,有你們的關(guān)注我們會(huì)做的更好,謝謝!
- 詳細(xì)介紹Android中回調(diào)函數(shù)機(jī)制
- Android中回調(diào)接口的使用介紹
- Android的Fragment的生命周期各狀態(tài)和回調(diào)函數(shù)使用
- 理解Android中Activity的方法回調(diào)
- android自定義控件和自定義回調(diào)函數(shù)步驟示例
- Android觀察者模式實(shí)例分析
- android開發(fā)中使用java觀察者模式
- Android源碼學(xué)習(xí)之觀察者模式應(yīng)用及優(yōu)點(diǎn)介紹
- 詳解Android中接口回調(diào)、方法回調(diào)
- Android回調(diào)與觀察者模式的實(shí)現(xiàn)原理
相關(guān)文章
點(diǎn)擊圖標(biāo)進(jìn)入指定瀏覽器將首頁(yè)設(shè)置全透明解決一閃而過問題
進(jìn)入瀏覽器之前有一個(gè)頁(yè)面閃了一下,那是因?yàn)閺哪莻€(gè)空白的首頁(yè)跳過去的。解決的辦法是把他變成透明的就好了2014-08-08深入剖析Android系統(tǒng)中Service和IntentService的區(qū)別
這篇文章主要介紹了Android系統(tǒng)中Service和IntentService的區(qū)別,與普通的服務(wù)相比,IntentService可以開啟單獨(dú)的線程來(lái)處理intent請(qǐng)求,需要的朋友可以參考下2016-04-04Android中的Retrofit+OkHttp+RxJava緩存架構(gòu)使用
Retrofit和OkHttp API以及JVM擴(kuò)展RxJava都是開源項(xiàng)目,大家可以輕松在GitHub上找到,下載和基本配置部分這里我們不作重點(diǎn),主要還是來(lái)看一下Android中的Retrofit+OkHttp+RxJava緩存架構(gòu)使用:2016-06-06Android仿銀行客戶簽名并且保存簽名的截圖文件并命名為本地時(shí)間
本文通過實(shí)例代碼給大家介紹了Android仿銀行客戶簽名并且保存簽名的截圖文件并命名為本地時(shí)間,需要的朋友可以參考下2017-07-07Android獲取手機(jī)配置信息具體實(shí)現(xiàn)代碼
下面為大家介紹下使用android獲取手機(jī)配置信息的具體過程,感興趣的朋友可以參考下哈,希望對(duì)你有所幫助2013-06-06Android中獲得正在運(yùn)行的程序和系統(tǒng)服務(wù)的方法
這篇文章主要介紹了Android中獲得正在運(yùn)行的程序和系統(tǒng)服務(wù)的方法,分別是對(duì)ActivityManager.RunningAppProcessInfo類和ActivityManager.RunningServiceInfo類的使用,需要的朋友可以參考下2016-02-02Android語(yǔ)音識(shí)別技術(shù)詳解及實(shí)例代碼
這篇文章主要介紹了Android語(yǔ)音識(shí)別技術(shù)的相關(guān)資料,并附實(shí)例代碼及實(shí)例實(shí)現(xiàn)效果圖,需要的朋友可以參考下2016-09-09Android Studio 3.6中新的視圖綁定工具ViewBinding 用法詳解
這篇文章主要介紹了Android Studio 3.6中新的視圖綁定工具ViewBinding 用法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03