Android回调的简单理解
1.什么是回調
回調的定義是在A類中定義了一個方法,這個方法中用到了一個接口和該接口中的抽象方法,但是抽象方法沒有具體的實現,需要B類去實現,B類實現該方法后,它本身不會去調用該方法,而是傳遞給A類,供A類去調用,這種機制就稱為回調,這個定義比較正式,但看起來太繞了,一會A類一會B類,把人繞暈了。
使用日常生活中的例子來理解一下,回調英文單詞是Callback,直譯為回呼或者回電話,那就用跟電話有關作為例子吧,假設一個客戶(客戶是公司A的員工)問你(你是公司B的員工)一個問題,例如如何賺大錢,但這個問題你當場不能給出答案,以免顯得很草率,這個時候你可以跟客戶說,稍等一下,等確認后再給您回個電話,這樣就可以掛了電話,想一下應該怎么回復客戶,等有了答案后,再給客戶回電話。這個過程使用到了回調機制。
再回頭來理解回調函數的定義,客戶就是A類,你是B類,而接口呢,指的是電話,接口的抽象方法,就是客戶咨詢你的問題的過程,確認問題這個過程當然得由你去實現,你實現之后(確定問題答案之后),再給客戶回電話,完成回調過程。
2.為什么用回調
從打電話的例子可以看到回調的好處,分別是:
1.異步處理問題
如果不采用回調機制,客戶需要一直在干等你的答案,你找答案的過程中,他啥也干不了,而采用回調方式后,客戶不需要一直在電話前等回復,可以先忙自己的事去。在程序中,例如執行一個耗時的下載任務,最優的處理方式采用異步方式,即主程序啟動下載后可以忙別的,下載程序執行完下載后告知主程序就行,這是異步處理帶來的好處。
2.同一個事件有不同的處理方法
還是用客戶打電話咨詢問題的例子。當我們確認好問題要回客戶的問題時,可以由你自己親自回復,也可以由其他同事代回復,只要完成回復客戶的約定即可。注意到回調定義中提到接口中的抽象方法,實現抽象方法方式多種多樣,只要重寫這個抽象方法就行。
3.代碼例子
1.首先定義一個接口和抽象方法,如下:
//定義回調接口 public interface PhoneCallback{void Counseling(); }2.定義一個公司A的類,在該類中實現對接口的調用
public class CompanyA {private PhoneCallback callBack;public CompanyA(){}public String Work(PhoneCallback callBack){//調用接口的抽象方法String answer= callBack.Counseling();return answer;} }3.定義一個公司B的類,在該類中實現接口的抽象方法,也就是確定好答案回復客戶的咨詢
public class CompanyB implements PhoneCallback {//重寫抽象方法@Overridepublic String Counseling() {String answer="公司B的答復:這個問題建議您咨詢有關部門";return answer;} }4.用界面展示以上的過程。其實以上已經完成了回調,這一步是用界面展示一下整個流程以及最終結果。
4.1 界面布局。布局很簡單,一個Button按鈕用于公司發起咨詢和一個TextView展示結果。
<?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發起咨詢"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 結果展示,點擊按鈕后,TextView控件展示了公司B的回復
5.總結
理解回調的過程,關鍵需要捋清楚其中的關系,首先回調肯定涉及到多方(多個類)之間互動,例子中是公司A和公司B,其實還可以有公司C,D等加入,而他們之間溝通的媒介是接口(Interface)和抽象方法,接口相當于現實生活中電話,抽象方法相當于打電話咨詢如何賺大錢,公司A可以咨詢公司B如何賺大錢,也可以咨詢公司C和公司D等如何賺大錢,而具體怎么回復,看各個公司想如何回復了,等他們想好了怎么回復,拿起電話打給公司A。關系捋清楚,已經算基本理解回調了。
總結
以上是生活随笔為你收集整理的Android回调的简单理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android JNI开发流程介绍
- 下一篇: Android Service介绍