Android回调的简单理解
1.什么是回調(diào)
回調(diào)的定義是在A類中定義了一個方法,這個方法中用到了一個接口和該接口中的抽象方法,但是抽象方法沒有具體的實現(xiàn),需要B類去實現(xiàn),B類實現(xiàn)該方法后,它本身不會去調(diào)用該方法,而是傳遞給A類,供A類去調(diào)用,這種機制就稱為回調(diào),這個定義比較正式,但看起來太繞了,一會A類一會B類,把人繞暈了。
使用日常生活中的例子來理解一下,回調(diào)英文單詞是Callback,直譯為回呼或者回電話,那就用跟電話有關(guān)作為例子吧,假設(shè)一個客戶(客戶是公司A的員工)問你(你是公司B的員工)一個問題,例如如何賺大錢,但這個問題你當(dāng)場不能給出答案,以免顯得很草率,這個時候你可以跟客戶說,稍等一下,等確認(rèn)后再給您回個電話,這樣就可以掛了電話,想一下應(yīng)該怎么回復(fù)客戶,等有了答案后,再給客戶回電話。這個過程使用到了回調(diào)機制。
再回頭來理解回調(diào)函數(shù)的定義,客戶就是A類,你是B類,而接口呢,指的是電話,接口的抽象方法,就是客戶咨詢你的問題的過程,確認(rèn)問題這個過程當(dāng)然得由你去實現(xiàn),你實現(xiàn)之后(確定問題答案之后),再給客戶回電話,完成回調(diào)過程。
2.為什么用回調(diào)
從打電話的例子可以看到回調(diào)的好處,分別是:
1.異步處理問題
如果不采用回調(diào)機制,客戶需要一直在干等你的答案,你找答案的過程中,他啥也干不了,而采用回調(diào)方式后,客戶不需要一直在電話前等回復(fù),可以先忙自己的事去。在程序中,例如執(zhí)行一個耗時的下載任務(wù),最優(yōu)的處理方式采用異步方式,即主程序啟動下載后可以忙別的,下載程序執(zhí)行完下載后告知主程序就行,這是異步處理帶來的好處。
2.同一個事件有不同的處理方法
還是用客戶打電話咨詢問題的例子。當(dāng)我們確認(rèn)好問題要回客戶的問題時,可以由你自己親自回復(fù),也可以由其他同事代回復(fù),只要完成回復(fù)客戶的約定即可。注意到回調(diào)定義中提到接口中的抽象方法,實現(xiàn)抽象方法方式多種多樣,只要重寫這個抽象方法就行。
3.代碼例子
1.首先定義一個接口和抽象方法,如下:
//定義回調(diào)接口 public interface PhoneCallback{void Counseling(); }2.定義一個公司A的類,在該類中實現(xiàn)對接口的調(diào)用
public class CompanyA {private PhoneCallback callBack;public CompanyA(){}public String Work(PhoneCallback callBack){//調(diào)用接口的抽象方法String answer= callBack.Counseling();return answer;} }3.定義一個公司B的類,在該類中實現(xiàn)接口的抽象方法,也就是確定好答案回復(fù)客戶的咨詢
public class CompanyB implements PhoneCallback {//重寫抽象方法@Overridepublic String Counseling() {String answer="公司B的答復(fù):這個問題建議您咨詢有關(guān)部門";return answer;} }4.用界面展示以上的過程。其實以上已經(jīng)完成了回調(diào),這一步是用界面展示一下整個流程以及最終結(jié)果。
4.1 界面布局。布局很簡單,一個Button按鈕用于公司發(fā)起咨詢和一個TextView展示結(jié)果。
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/tvResult"android:layout_width="wrap_content"android:layout_height="wrap_content"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /><Buttonandroid:id="@+id/bCompany"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="27dp"android:layout_marginTop="32dp"android:text="公司A發(fā)起咨詢"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>4.2 主界面MainActivity代碼
import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView;public class MainActivity extends AppCompatActivity {Button bCommpanyA;TextView tvResult;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bCommpanyA=findViewById(R.id.bCompany);tvResult=findViewById(R.id.tvResult);bCommpanyA.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {CompanyA cA=new CompanyA();CompanyB cB=new CompanyB();String answer= cA.Work(cB);tvResult.setText(answer);}});} }4.3 結(jié)果展示,點擊按鈕后,TextView控件展示了公司B的回復(fù)
5.總結(jié)
理解回調(diào)的過程,關(guān)鍵需要捋清楚其中的關(guān)系,首先回調(diào)肯定涉及到多方(多個類)之間互動,例子中是公司A和公司B,其實還可以有公司C,D等加入,而他們之間溝通的媒介是接口(Interface)和抽象方法,接口相當(dāng)于現(xiàn)實生活中電話,抽象方法相當(dāng)于打電話咨詢?nèi)绾钨嵈箦X,公司A可以咨詢公司B如何賺大錢,也可以咨詢公司C和公司D等如何賺大錢,而具體怎么回復(fù),看各個公司想如何回復(fù)了,等他們想好了怎么回復(fù),拿起電話打給公司A。關(guān)系捋清楚,已經(jīng)算基本理解回調(diào)了。
總結(jié)
以上是生活随笔為你收集整理的Android回调的简单理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android JNI开发流程介绍
- 下一篇: Android Service介绍