1. 程式人生 > >弄明白Android 介面回撥機制

弄明白Android 介面回撥機制

以前對於這個機制理解不夠深刻,現在重新整理下思路。

一、建模

我理解的介面回撥就是,我這個類實現了一個接口裡的方法doSomething,然後註冊到你這裡,然後我就去做別的事情去了,你在某個觸發的時機回頭來呼叫我doSomething的方法。好比,我給你打電話問某個難題,你電話裡想不出來,於是說等想到了再回我電話。於是介面回撥機制比喻模型如下

 

第一步:

首先,你我得約定,這個實現的方法是咋樣的,叫什麼名字,需要傳入傳出什麼。為什麼要這樣呢?你我得約定電話聯絡,不是微信扣扣。這就是約定的介面。

我們約定當你想到問題的答案就回我,所以這裡傳入引數是你想到的答案。

public interface ContactInterface {
 
public void callBackByTel(String answer);
 
}


第二步:

我得先打電話(註冊)到你那,告訴你我的問題是什麼。是吧。

所以你那裡必須有個方法讓我告訴你問題相關事宜(註冊)。


 public void setCallBack(String who,String question,ContactInterface callBack) {
 this.who = who;        
 System.out.println("你說:當前聯絡到我的人是"+who+",問題是"+question);
        this.callBack =callBack;
    }

第三步:

當你想到問題的答案後,打電話告訴我答案,即回撥我傳進來的方法。


public void handleThings(){
 //假如你現在正在想問題的答案,需要一點時間
 for(int i=0;i<100000;i++){ 
              if(i == 0){
                      System.out.println("你正在思考問題.....");
              }
        }
 
 String answer = "答案是A";
 //想到問題的辦法了
 System.out.println("你說:想到答案了,準備打回去給"+who+"告訴他答案");
 callBack.callBackByTel(answer);
 }

OK整個機制構成三要素就是:我(客戶端),你(服務端),約定(介面)

 我類——

public class Me {

	 public static void main(String[] args){  
		 
		 Me me = new Me();
		 me.hasQuestion();
		 
	 }
	 
	 private void hasQuestion(){
		 //現在有問題想不出來答案,想去問你
		 You you = new You();
		 you.setCallBack("蝸牛", "某道題答案是什麼?", new ContactInterface() {
			
			@Override
			public void callBackByTel(String answer) {
				System.out.println("我說:嗯,好的,我收到答案了:"+answer+",謝謝");
				
			}
		});
		 //你接到電話,起床開始思考問題
		new Thread(you).start();
	 }
}

你類——
package lin.callback.test;

public class You implements Runnable{

	
	private String who;
	 private ContactInterface callBack;  
	 public You() {
			// TODO Auto-generated constructor stub
		}
	 
	//呼叫此方法就表示有人聯絡你了,註冊到你這來
	 public void setCallBack(String who,String question,ContactInterface callBack) {
		 this.who = who;	
		 System.out.println("你說:當前聯絡到我的人是"+who+",問題是"+question);
	        this.callBack =callBack;
	    }
	   
	 public void handleThings(){
		 //假如你現在正在想問題的答案,需要一點時間
		 for(int i=0;i<100000;i++){  
	              if(i == 0){
	            	  System.out.println("你正在思考問題.....");
	              }
	        }
		 
		 String answer = "答案是A";
		 //想到問題的辦法了
		 System.out.println("你說:想到答案了,準備打回去給"+who+"告訴他答案");
		 callBack.callBackByTel(answer);
	 }

	/* (non-Javadoc)
	 * @see java.lang.Runnable#run()
	 */
	@Override
	public void run() {
		try {
			Thread.sleep(1000);
			handleThings();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	 
	 
}

介面類——
public interface ContactInterface {
	
	public void callBackByTel(String answer);
	
}

驗證結果:


二、總結

Java中沒有函式指標這一說,因為java沒有指標,但是並不代表著它不會使用這個功能。事實上,引用就是實現了指標的功能。

回撥方法就是一個通過方法指標來呼叫的方法。如果我將這個方法的指標(地址,引用)通過形參傳遞到另一個類的某個方法裡,那麼當這個類呼叫該方法裡面我所傳入的指標時,就能呼叫我這邊的方法。

整個過程就是我傳入方法A的地址,你接收,並在某個時刻回撥我這邊的A方法。

由於java沒辦法操作指標,於是它用介面來實現。

JAVA方法回撥是一種耦合設計思想。作為一種架構,必須有自己的執行環境,並且提供使用者的實現介面。

主要步驟如下:

  •  定義介面 Callback ,包含回撥方法 callback();
  • 服務端提供註冊的方法,並設定在某個條件下會回撥介面方法;
  • 客戶端提供介面的實現方法,並註冊到服務端,把方法地址傳進去。

這樣,在需要的時候,可用Caller物件的mCallback介面成員呼叫callback()方法,完成回調了。

三、Android中的回撥機制

android中回撥機制被大量使用。

比如,在Activity中定義了很多生命週期的不同狀態要呼叫的方法,這些方法都是空實現,系統框架要呼叫,使用者也要呼叫來實現。或者更直接的是按鍵點選的實現方法。


loginButton.setOnClickListener(new OnClickListener() {
 
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
 
}
});

明顯,OnClickListener就是android系統所約定好的介面,然後我們寫的應用程式就是客戶端,android 系統就是服務端。模型關係如下圖所示:

以上可以看出,介面(系統框架)是系統提供的,介面的實現是使用者實現的,這樣可以達到介面統一,實現不同的效果。

系統在不同的狀態“回撥”我們的實現類,來達到介面和實現的分類。

 

相關推薦

明白Android 介面機制

以前對於這個機制理解不夠深刻,現在重新整理下思路。 一、建模 我理解的介面回撥就是,我這個類實現了一個接口裡的方法doSomething,然後註冊到你這裡,然後我就去做別的事情去了,你在某個觸發的時機回頭來呼叫我doSomething的方法。好比,我給你打電話問某個難題,你

Android 介面機制詳解

       在使用介面回撥的時候發現了一個經常犯的錯誤,就是回撥函式裡面的實現有可能是用多執行緒或者是非同步任務去做的,這就會導致我們期望函式回撥完畢去返回一個主函式的結果,實際發現是行不通的,因為

Android介面機制(有圖有真相,如果你一直接觸介面,但是自己又一直理解不了,這篇文章會讓你秒懂)

本人自己也經常在開發中遇到介面回撥機制,說來慚愧,雖然一直在用介面,但是隻是去複製別人的程式碼,一直弄不明白介面回撥的原理,甚至自己也努力去看了很多篇文章,幾乎看了所有的介面回撥的例子,什麼延時問答啊,孔融讓梨啊,都看了,例子都能背下來了,兩三個月了還沒理解。看來本人頭腦不

Android 介面機制

以前對於這個機制理解不夠深刻,現在重新整理下思路。 一、建模 我理解的介面回撥就是,我這個類實現了一個接口裡的方法doSomething,然後註冊到你這裡,然後我就去做別的事情去了,你在某個觸發的時機回頭來呼叫我doSomething的方法。好比,我給你打電話問某個難

對於Android介面機制的理解

對於介面回撥機制首先要弄明白的問題是為什麼需要它,也就是介面回撥能為我們解決什麼問題: 在開發過程中我們經常會遇到一些有關觸發執行的問題,比如使用者觸發按鈕,然後程式就執行了一系列的操作的比如註冊登入啊;問題的核心在於為什麼是出發了按鈕才執行,不觸發就不執行嗎? 這個時候就能體現出各

通俗易懂的讓你徹底明白介面機制

轉載請註明出處:flowsky37的部落格,尊重他人辛苦勞動! 介面回撥簡單理解就是:類A中呼叫B類的中方法C,而B又反過去呼叫A中的方法D,然後D稱為A的回撥方法。是不是心中有一萬隻草泥馬在奔騰,到底說的是什麼。感覺像是你中有我,我中有你,糾

Android 介面實現Fragment的跳轉

---------------------MainActivity------------------- package com.example.earl.fragmentinterfacejump; import android.app.Activity; import androi

Android介面傳遞資料

一 、回撥函式回撥函式就是一個通過函式指標呼叫的函式。如果你把函式的指標(地址)作為引數傳遞給另一個函式,當這個指標被用為呼叫它所指向的函式時,我們就說這是回撥函式。回撥函式不是由該函式的實現方直接呼叫,而是在特定的事件或條件發生時由另外的一方呼叫的,用於對該事件或條件進行

介面機制詳解

在一個類中進行介面定義和呼叫介面中的方法public class Topbar { //需要一個變數來對映呼叫者傳進來的一個介面 private topbarClickListner liste

詳解Android機制與RecyclerView的Item點選事件實現

總是看書上寫著回調回調,以為就是函式呼叫換了個名字,尤其是看了Button的點選事件實現後,覺得不就是觸發機制。 A事件發生->後臺處理邏輯->告訴前臺怎麼做->結束。 Android常見button點選事件: loginB

關於 android 介面的一點思考,

對於android 新手來說,我們不論是在書上,還是在老師講課的時候。總是不斷聽見,當什麼什麼時候,回撥onstart()方法。那麼究竟android 回撥介面是什麼呢。 這個有興趣可以網上搜一下哈,網上文章都比我說的好。 那麼也許 你會說,你什麼***都不說, 你寫這個幹嘛

android 非同步機制

android事件處理: 基於監聽,基於回撥。 基於監聽,是為android介面元件繫結特定的事件監聽器。主要處理一些特定的事件。 基於回撥,時重寫android元件特定的回撥方法,或者重寫activity的回撥方法。android為絕大部分介面元件都提供了事件響應的回撥方

java的介面機制詳解

原文地址:http://www.open-open.com/lib/view/open1461482321288.html 序言 最近學習java,接觸到了回撥機制(CallBack)。初識時感覺比較混亂,而且在網上搜索到的相關的講解,要麼一言帶過,要麼說的比較

android介面詳解、簡單例子+複雜例子

package test.ban.com.callback;/** * Created by apple on 16/8/30. */ import android.annotation.SuppressLint; import android.app.Activity; import android.

Android介面總結,以及運用到彈窗PopWindow的Demo實現

背景: 最近專案中接觸到介面回撥,以及Android彈窗PopWindow元件的使用,現在利用學到的知識自己寫了一個簡單的Demo,練習下在Android下如何運用介面回撥,來實現彈窗PopWindow的功能。 程式碼結構: 1. 定義一個介面:OnSelectIt

Android中的介面詳解,機制:以Activity和Adapter傳遞資料為例。

首先解決啥是回撥: 我覺得這個例子比較好:某天,我打電話向你請教問題,當然是個難題,你一時想不出解決方法,我又不能拿著電話在那裡傻等,於是我們約定:等你想出辦法後打手機通知我,這樣,我就掛掉電話辦其它事情去了。過了XX分鐘,我的手機響了,你興高采烈的說問題已經搞定,應該

Android : Recyclerview的使用以及介面

先上效果圖 Recyclerview是沒有點選事件的,所以介面回撥就是寫的點選事件 需要用到的jar包 implementation 'com.android.support:recyclerview-v7:28.0.0' android.support.v7.widget

Android中Recyclerview使用7----條目中按鈕點選事件,在activity中呼叫(介面)

0引入Recyclerview的支援庫    compile 'com.android.support:recyclerview-v7:23.4.0' 1效果圖: 2程式碼: 2.1MainActivity中: <span style="font-size:18p

Android http請求使用介面

Android中不支援在主執行緒發起http請求資料,我們需要把http請求放到子執行緒中處理。為了保證程式碼的執行順序,可以使用介面回撥的方式拿到請求到的資料並進行處理。 定義回撥介面 public interface OnConnectResult

android 萬能介面

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">剛做android開發時經常遇到資料傳遞的問題,因為對Java也不是很熟