1. 程式人生 > >Android 介面回撥機制詳解

Android 介面回撥機制詳解

       在使用介面回撥的時候發現了一個經常犯的錯誤,就是回撥函式裡面的實現有可能是用多執行緒或者是非同步任務去做的,這就會導致我們期望函式回撥完畢去返回一個主函式的結果,實際發現是行不通的,因為如果回撥是多執行緒的話你是無法和主函式同步的,也就是返回的資料是錯誤的,這是非常隱祕的一個錯誤。那有什麼好的方法去實現資料的線性傳遞呢?先介紹下回調機制原理。

回撥函式

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

詳細解釋:
  客戶程式C呼叫服務程式S中的某個函式A,然後S又在某個時候反過來呼叫C中的某個函式B,對於C來說,這個B便叫做回撥函式。例如Win32下的視窗過程函式就是一個典型的回撥函式。一般說來,C不會自己呼叫B,C提供B的目的就是讓S來呼叫它,而且是C不得不提供。由於S並不知道C提供的B姓甚名誰,所以S會約定B的介面規範(函式原型),然後由C提前通過S的一個函式R告訴S自己將要使用B函式,這個過程稱為回撥函式的註冊,R稱為註冊函式。Web Service以及Java的RMI都用到回撥機制,可以訪問遠端伺服器程式。
下面舉個通俗的例子:
  某天,我打電話向你請教問題,當然是個難題,你一時想不出解決方法,我又不能拿著電話在那裡傻等,於是我們約定:等你想出辦法後打手機通知我,這樣,我就掛掉電話辦其它事情去了。過了XX分鐘,我的手機響了,你興高采烈的說問題已經搞定,應該如此這般處理。故事到此結束。這個例子說明了“非同步+回撥”的程式設計模式。其中,你後來打手機告訴我結果便是一個“回撥”過程;我的手機號碼必須在以前告訴你,這便是註冊回撥函式;我的手機號碼應該有效並且手機能夠接收到你的呼叫,這是回撥函式必須符合介面規範。

  JAVA中不允許直接操作指標,那它的回撥是如何實現的呢?
  答案:它是通過介面或者內部類來實現的。
  JAVA方法回撥是功能定義和功能實現分享的一種手段,是一種耦合設計思想。作為一種架構,必須有自己的執行環境,並且提供使用者的實現介面。
  1. 定義介面 Callback ,包含回撥方法 callback()
  2. 在一個類Caller 中宣告一個Callback介面物件 mCallback
  3. 在程式中賦予 Caller物件的介面成員(mCallback) 一個內部類物件如
  new Callback(){
    callback(){
      //函式的具體實現
    }
  }

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

回撥機制在Android框架中的使用

在Activity中定義了很多生命週期的不同狀態要呼叫的方法,這些方法都是空實現,系統框架要呼叫,使用者也要呼叫來實現。
  例項(對於Android介面上Button點選事件監聽的模擬):
    a.定義介面
    public interface OnClickListener {
      public void OnClick(Button b);
    b. 定義Button
     public class Button {
      OnClickListener listener;
      public void click() {
        listener.OnClick(this);
      }
      public void setOnClickListener(OnClickListener listener) {
        this.listener = listener;
      }
     }
    c. 將介面物件OnClickListener 賦給 Button的介面成員
    public class Activity {
      public Activity() {
      }
      public static void main(String[] args) {
        Button button = new Button();
        button.setOnClickListener(new OnClickListener(){
          @Override
          public void OnClick(Button b) {
            System.out.println("clicked");
          }
        });
        button.click(); //user click,System call button.click();
      }
    }

機制原理如上,那資料傳遞依靠介面怎麼傳遞呢?上程式碼:

 /* 
 * @author sunglasses
 * @category 利用xUtils框架封裝get方法,IOAuthCallBack是資料介面回撥,send方法裡面 有非同步任務方法,
 * 傳統返回資料方法可能返回資料不正確。
 */
  public class xUtilsGet {

	public void getJson(String url,RequestParams params,final IOAuthCallBack iOAuthCallBack){

        HttpUtils http = new HttpUtils();
        http.configCurrentHttpCacheExpiry(1000 * 10);
        http.send(HttpMethod.GET, url, params, new RequestCallBack<String>() {

			@Override
			public void onFailure(HttpException arg0, String arg1) {
				// TODO Auto-generated method stub
			}

			@Override
			public void onSuccess(ResponseInfo<String> info) {
				// TODO Auto-generated method stub
				iOAuthCallBack.getIOAuthCallBack(info.result);
			}
		});
	}}

我用的是xUtils開發框架然後返回資料的時候用的是介面回撥,介面定義如下:
  public interface IOAuthCallBack {
	public void getIOAuthCallBack(String result);
}

上層函式定義如下:
public void getCataJson(int cityId,IOAuthCallBack iOAuthCallBack) {
		String url = "http://xxxxxxx";
		RequestParams params = new RequestParams();
        params.addQueryStringParameter("currentCityId", cityId+"");
		getJson(url,params,iOAuthCallBack);
	}


getcatajson是在你想得到資料的類中呼叫,然後傳入引數和介面物件,介面物件中是要對最終資料進行處理。具體機制原理如上。這樣就可以避免介面回撥中的多執行緒資料不一致問題。

相關推薦

Android 介面機制

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

介面機制

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

java的介面機制

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

java機制

原文出自這兒:https://blog.csdn.net/fengye454545/article/details/80198446   為了自己能夠加深理解自己動手敲了一遍,也寫寫,有時間看看。更詳細建議訪問原創博主。 ===========================

弄明白Android 介面機制

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

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

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

Android 介面機制

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

Java基礎篇:機制

一、什麼是回撥: 回撥是一種雙向的呼叫模式,程式模組之間通過這樣的介面呼叫完成通訊聯絡,回撥的核心就是回撥方將本身即this傳遞給呼叫方,這樣呼叫方就可以在呼叫完畢之後再告訴回撥方它想要知道的資訊。 回撥函式用於層間協作,上層將本層函式安裝在下層,這個函式就是回撥,而下層

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

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

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

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

對於Android介面機制的理解

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

Android EditText的TextWatcher監聽引數

先貼程式碼 mEditText = (EditText) findViewById(R.id.edittext); mEditText.addTextChangedListener(new TextWatcher() {

Android總結篇——Intent機制及示例總結

ets mp3 pro domain 一般來說 ssa star wrap 無線 一.Intent介紹: Intent的中文意思是“意圖,意向”,在Android中提供了Intent機制來協助應用間的交互與通訊,Intent負責對應用中一次操作的動 作、動作涉及

Android開發——事件分發機制---微信魚蝦蟹源碼搭建

lai reset 微信 影響 ren 事件分發機制 lis forum hlist 轉載請註明出處:http://h5.hxforum.com深入學習事件分發機制,是為了解決在Android開發中遇到的滑動沖突問題做準備。事件分發機制描述了用戶的手勢一系列事件是如何被An

Android 介面實現Fragment的跳轉

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

Android非同步訊息處理機制及原始碼分析

PS一句:最終還是選擇CSDN來整理髮表這幾年的知識點,該文章平行遷移到CSDN。因為CSDN也支援MarkDown語法了,牛逼啊! 【工匠若水 http://blog.csdn.net/yanbober 轉載煩請註明出處,尊重分享成果】 最近相對來說比較閒,加上養病,所

java函式

宣告:部落格參考於https://www.cnblogs.com/yangmin86/p/7090882.html,謝謝哥們 回撥函式:是指在A類執行程式碼時,呼叫了B類中的方法,但B類中的方法執行了A類中的方法。 example: 1、Boss.java(Boss類中執行程式碼,呼叫了Emp類的doP

Android觸控式螢幕事件派發機制與原始碼分析三(Activity篇)

PS一句:最終還是選擇CSDN來整理髮表這幾年的知識點,該文章平行遷移到CSDN。因為CSDN也支援MarkDown語法了,牛逼啊! 【工匠若水 http://blog.csdn.net/yanbober】 該篇承接上一篇《Android觸控式螢幕事件派發機制詳解與原始碼分析

Android觸控式螢幕事件派發機制與原始碼分析二(ViewGroup篇)

【工匠若水 http://blog.csdn.net/yanbober】 該篇承接上一篇《Android觸控式螢幕事件派發機制詳解與原始碼分析一(View篇)》,閱讀本篇之前建議先閱讀。當然,閱讀完這一篇之後可以閱讀繼續進階的下一篇《Android觸控式螢幕事件派發機制詳解與原始碼

Android觸控式螢幕事件派發機制與原始碼分析一(View篇)

【工匠若水 http://blog.csdn.net/yanbober】 Notice:閱讀完該篇之後如果想繼續深入閱讀Android觸控式螢幕事件派發機制詳解與原始碼分析下一篇請點選《Android觸控式螢幕事件派發機制詳解與原始碼分析二(ViewGroup篇)》檢視。 1