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