搜尋
首頁Javajava教程關於回呼機制的程式碼詳解

這篇文章主要介紹了java回呼機制實例詳解的相關資料,需要的朋友可以參考下

#java回呼機制實例詳解

#以前不理解什麼叫回調,天天聽人家說加一個回調方法啥的,心裡想我草,什麼叫回調方法啊?然後自己就在網路上找啊找啊找,找了很多也不是很明白,現在知道了,所謂回調:就是A類中調用B類中的某個方法C,然後B類中反過來調用A類中的方法D,D這個方法就叫回調方法,這樣子說你是不是有點暈暈的,其實我剛開始也是這樣不理解,看了人家說比較經典的回調方式:

  • Class A實作介面CallBack callback——背景1

  • class A中包含一個class B的引用b ——背景2

  • class B有一個參數為callback的方法f(CallBack callback) — —背景3

  • A的物件a呼叫B的方法f(CallBack callback) -A類別呼叫B類別的某個方法C

  • 然後b就可以在f(CallBack callback)方法中呼叫A的方法-B類別呼叫A類別的某個方法D

大家都喜歡用打電話的例子,好吧,為了跟上時代,我也用這個例子好了,我這個例子採用異步加回調

有一天小王遇到一個很難的問題,問題是“1 + 1 = ?”,就打電話問小李,小李一下子也不知道,就跟小王說,等我辦完手上的事情,就去想想答案,小王也不會傻傻的拿著電話去等小李的答案吧,於是小王就對小李說,我還要去逛街,你知道了答案就打我電話告訴我,於是掛了電話,自己辦自己的事情,過了一個小時,小李打了小王的電話,告訴他答案是2

/** 
 * 这是一个回调接口 
 * @author xiaanming 
 * 
 */ 
public interface CallBack { 
 /** 
  * 这个是小李知道答案时要调用的函数告诉小王,也就是回调函数 
  * @param result 是答案 
  */ 
 public void solve(String result); 
}
/** 
 * 这个是小王 
 * @author xiaanming 
 * 实现了一个回调接口CallBack,相当于----->背景一 
 */ 
public class Wang implements CallBack { 
 /** 
  * 小李对象的引用 
  * 相当于----->背景二 
  */ 
 private Li li; 
 
 /** 
  * 小王的构造方法,持有小李的引用 
  * @param li 
  */ 
 public Wang(Li li){ 
  this.li = li; 
 } 
  
 /** 
  * 小王通过这个方法去问小李的问题 
  * @param question 就是小王要问的问题,1 + 1 = ? 
  */ 
 public void askQuestion(final String question){ 
  //这里用一个线程就是异步, 
  new Thread(new Runnable() { 
   @Override 
   public void run() { 
    /** 
     * 小王调用小李中的方法,在这里注册回调接口 
     * 这就相当于A类调用B的方法C 
     */ 
    li.executeMessage(Wang.this, question); 
   } 
  }).start(); 
   
  //小网问完问题挂掉电话就去干其他的事情了,诳街去了 
  play(); 
 } 
 
 public void play(){ 
  System.out.println("我要逛街去了"); 
 } 
 
 /** 
  * 小李知道答案后调用此方法告诉小王,就是所谓的小王的回调方法 
  */ 
 @Override 
 public void solve(String result) { 
  System.out.println("小李告诉小王的答案是--->" + result); 
 } 
  
}
/** 
 * 这个就是小李啦 
 * @author xiaanming 
 * 
 */ 
public class Li { 
 /** 
  * 相当于B类有参数为CallBack callBack的f()---->背景三 
  * @param callBack 
  * @param question 小王问的问题 
  */ 
 public void executeMessage(CallBack callBack, String question){ 
  System.out.println("小王问的问题--->" + question); 
   
  //模拟小李办自己的事情需要很长时间 
  for(int i=0; i<10000;i++){ 
    
  } 
   
  /** 
   * 小李办完自己的事情之后想到了答案是2 
   */ 
  String result = "答案是2"; 
   
  /** 
   * 于是就打电话告诉小王,调用小王中的方法 
   * 这就相当于B类反过来调用A的方法D 
   */ 
  callBack.solve(result);  
 } 
}
/** 
 * 测试类 
 * @author xiaanming 
 * 
 */ 
public class Test { 
 public static void main(String[]args){ 
  /** 
   * new 一个小李 
   */ 
  Li li = new Li(); 
 
  /** 
   * new 一个小王 
   */ 
  Wang wang = new Wang(li); 
   
  /** 
   * 小王问小李问题 
   */ 
  wang.askQuestion("1 + 1 = ?"); 
 } 
}

透過上面的那個例子你是不是差不多明白了回調機制呢,上面是一個非同步回調,我們來看看同步回呼吧,onClick()方法
現在來分析分析下Android# View的點擊方法onclick();我們知道onclick()是一個回呼方法,當使用者點擊View就執行這個方法,我們用Button來舉例好了

//这个是View的一个回调接口 
/** 
 * Interface definition for a callback to be invoked when a view is clicked. 
 */ 
public interface OnClickListener { 
 /** 
  * Called when a view has been clicked. 
  * 
  * @param v The view that was clicked. 
  */ 
 void onClick(View v); 
}
package com.example.demoactivity; 
 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.Toast; 
 
/** 
 * 这个就相当于Class A 
 * @author xiaanming 
 * 实现了 OnClickListener接口---->背景一 
 */ 
public class MainActivity extends Activity implements OnClickListener{ 
 /** 
  * Class A 包含Class B的引用----->背景二 
  */ 
 private Button button; 
 
 @Override 
 public void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.activity_main); 
  button = (Button)findViewById(R.id.button1); 
   
  /** 
   * Class A 调用View的方法,而Button extends View----->A类调用B类的某个方法 C 
   */ 
  button.setOnClickListener(this); 
 } 
 
 /** 
  * 用户点击Button时调用的回调函数,你可以做你要做的事 
  * 这里我做的是用Toast提示OnClick 
  */ 
 @Override 
 public void onClick(View v) { 
  Toast.makeText(getApplication(), "OnClick", Toast.LENGTH_LONG).show(); 
 } 
 
}

下面是View類別的setOnClickListener方法,就相當於B類咯,只把關鍵程式碼貼出來

/** 
 * 这个View就相当于B类 
 * @author xiaanming 
 * 
 */ 
public class View implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource { 
 /** 
  * Listener used to dispatch click events. 
  * This field should be made private, so it is hidden from the SDK. 
  * {@hide} 
  */ 
 protected OnClickListener mOnClickListener; 
  
 /** 
  * setOnClickListener()的参数是OnClickListener接口------>背景三 
  * Register a callback to be invoked when this view is clicked. If this view is not 
  * clickable, it becomes clickable. 
  * 
  * @param l The callback that will run 
  * 
  * @see #setClickable(boolean) 
  */ 
  
 public void setOnClickListener(OnClickListener l) { 
  if (!isClickable()) { 
   setClickable(true); 
  } 
  mOnClickListener = l; 
 } 
  
  
 /** 
  * Call this view&#39;s OnClickListener, if it is defined. 
  * 
  * @return True there was an assigned OnClickListener that was called, false 
  *   otherwise is returned. 
  */ 
 public boolean performClick() { 
  sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED); 
 
  if (mOnClickListener != null) { 
   playSoundEffect(SoundEffectConstants.CLICK); 
    
   //这个不就是相当于B类调用A类的某个方法D,这个D就是所谓的回调方法咯 
   mOnClickListener.onClick(this); 
   return true; 
  } 
 
  return false; 
 } 
}

這個例子就是Android典型的回呼機制,看完這個你是不是更進一步的理解了回呼機制呢? 執行緒run()也是回呼方法,當執行Thread的start()方法就會回呼這個run()方法,還有處理訊息都比較經典等等

【相關推薦】

1. Java免費視訊教學

2. 阿里巴巴Java開發手冊

3. 極客學院Java影片教學

以上是關於回呼機制的程式碼詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
平台獨立性如何使企業級的Java應用程序受益?平台獨立性如何使企業級的Java應用程序受益?May 03, 2025 am 12:23 AM

Java在企業級應用中被廣泛使用是因為其平台獨立性。 1)平台獨立性通過Java虛擬機(JVM)實現,使代碼可在任何支持Java的平台上運行。 2)它簡化了跨平台部署和開發流程,提供了更大的靈活性和擴展性。 3)然而,需注意性能差異和第三方庫兼容性,並採用最佳實踐如使用純Java代碼和跨平台測試。

考慮到平台獨立性,Java在物聯網(物聯網)設備的開發中扮演什麼角色?考慮到平台獨立性,Java在物聯網(物聯網)設備的開發中扮演什麼角色?May 03, 2025 am 12:22 AM

JavaplaysigantroleiniotduetoitsplatFormentence.1)itallowscodeTobewrittenOnCeandrunonVariousDevices.2)Java'secosystemprovidesuseusefidesusefidesulylibrariesforiot.3)

描述一個方案,您在Java中遇到了一個特定於平台的問題以及如何解決。描述一個方案,您在Java中遇到了一個特定於平台的問題以及如何解決。May 03, 2025 am 12:21 AM

ThesolutiontohandlefilepathsacrossWindowsandLinuxinJavaistousePaths.get()fromthejava.nio.filepackage.1)UsePaths.get()withSystem.getProperty("user.dir")andtherelativepathtoconstructthefilepath.2)ConverttheresultingPathobjecttoaFileobjectifne

Java平台獨立對開發人員有什麼好處?Java平台獨立對開發人員有什麼好處?May 03, 2025 am 12:15 AM

Java'splatFormIndenceistificantBecapeitAllowSitallowsDevelostWriTecoDeonCeandRunitonAnyPlatFormwithAjvm.this“ writeonce,runanywhere”(era)櫥櫃櫥櫃:1)交叉plat formcomplibility cross-platformcombiblesible,enablingDeploymentMentMentMentMentAcrAptAprospOspOspOssCrossDifferentoSswithOssuse; 2)

將Java用於需要在不同服務器上運行的Web應用程序的優點是什麼?將Java用於需要在不同服務器上運行的Web應用程序的優點是什麼?May 03, 2025 am 12:13 AM

Java適合開發跨服務器web應用。 1)Java的“一次編寫,到處運行”哲學使其代碼可在任何支持JVM的平台上運行。 2)Java擁有豐富的生態系統,包括Spring和Hibernate等工具,簡化開發過程。 3)Java在性能和安全性方面表現出色,提供高效的內存管理和強大的安全保障。

JVM如何促進Java的'寫作一次,在任何地方運行”(WORA)功能?JVM如何促進Java的'寫作一次,在任何地方運行”(WORA)功能?May 02, 2025 am 12:25 AM

JVM通過字節碼解釋、平台無關的API和動態類加載實現Java的WORA特性:1.字節碼被解釋為機器碼,確保跨平台運行;2.標準API抽像操作系統差異;3.類在運行時動態加載,保證一致性。

Java的較新版本如何解決平台特定問題?Java的較新版本如何解決平台特定問題?May 02, 2025 am 12:18 AM

Java的最新版本通過JVM優化、標準庫改進和第三方庫支持有效解決平台特定問題。 1)JVM優化,如Java11的ZGC提升了垃圾回收性能。 2)標準庫改進,如Java9的模塊系統減少平台相關問題。 3)第三方庫提供平台優化版本,如OpenCV。

說明JVM執行的字節碼驗證的過程。說明JVM執行的字節碼驗證的過程。May 02, 2025 am 12:18 AM

JVM的字節碼驗證過程包括四個關鍵步驟:1)檢查類文件格式是否符合規範,2)驗證字節碼指令的有效性和正確性,3)進行數據流分析確保類型安全,4)平衡驗證的徹底性與性能。通過這些步驟,JVM確保只有安全、正確的字節碼被執行,從而保護程序的完整性和安全性。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。