1. 程式人生 > >Android 的介面回撥事件

Android 的介面回撥事件

看見網上一些回撥的解釋都很複雜的,特別基於Android的自定義回撥,感覺一頭霧水,於是乎,我也寫了這篇基於我對回撥的解釋。

先來看一個簡單的例子:
有兩個類 ClassA ,和 ClassB, ClassA呼叫ClassB裡面的方法,

public class ClassB {

    public void method_from_classB(){
        
        for(int i=0;i<10;i++)
            System.out.print("..."+i);
    }
}
public class ClassA {

     
    
    public
static void main(String args[])
{ ClassB classB = new ClassB(); classB.method_from_classB(); } }

輸出:

...0...1...2...3...4...5...6...7...8...9

臥槽,哪個傻逼寫的博文,侮辱我的智商不是嗎,嘻嘻,是為了做比較,接下來看看利用回撥, ClassA 是怎麼呼叫 ClassB中的 方法的,注意是回撥:

讓ClassB 實現 ClassA定義的介面

public class ClassB implements
ClassA.ClassAInterface
{ public ClassB(){ new ClassA().RegisterInterface(this); System.out.println("...ClassB..."+this); } @Override public void method_from_interface() { for(int i=0;i<10;i++) System.out.print("..."+i); } /* public void method_from_classB(){ for(int i=0;i<10;i++) System.out.print("..."+i); }*/
}

ClassA裡面定義介面和抽象方法:

public class ClassA {

    public static ClassAInterface classAInterface;
    
    public interface ClassAInterface{
        
        public void method_from_interface();
    }
    public void RegisterInterface(ClassAInterface a_interface){

        this.classAInterface = a_interface;
        System.out.println("...a_interface..."+a_interface);
    }
 
    public static void main(String args[]){
     
        ClassB classB = new ClassB();// 標記@1,最後面做解釋
        //classB.method_from_classB();
        System.out.println("...classAInterface..."+classAInterface);
         if(classAInterface != null){
                classAInterface.method_from_interface();
            }
    }
}

輸出:

...0...1...2...3...4...5...6...7...8...9

整理下,也就是 我在ClassA裡面定義了一個介面(interface),接口裡面又定義了一個方法,但沒有方法體,也就不做任何事情。 
當 ClassA 執行到 mian() 函式時,就會呼叫介面的方法,但前面講了,介面的方法沒有實現具體的事情,它就會找到 ClassB 裡面對應的 方法,來實現具體的事情。
呦呦呦,ClassA 的介面的方法是怎麼找到 ClassB 的方法,難道會上天???
也就是下面分析這句程式碼是怎麼上天的:

// 利用介面的回撥實現 ClassB中 的方法的 具體事情
 classAInterface.method_from_interface();

我在上面的程式碼中用 System.out.println 打印出了日誌做分析:
第一個(ClassA中的方法):

    public void RegisterInterface(ClassAInterface a_interface){

        this.classAInterface = a_interface;
        System.out.println("...a_interface..."+a_interface);
    }

輸出:

...a_interface...ClassB@3ddb8962

第二個:

public ClassB(){
        
        new ClassA().RegisterInterface(this);
        System.out.println("...ClassB..."+this);
    }

輸出:

...ClassB...ClassB@3ddb8962

第三個:

System.out.println("...classAInterface..."+classAInterface);
         if(classAInterface != null){
                classAInterface.method_from_interface();
            }

輸出:

...classAInterface...ClassB@3ddb8962

看到這裡是不是恍然大悟呢 ,輸出都是 “ [email protected] ” 也就是ClassB 物件的引用!!!

啊!介面只不過是將 ClassB 物件的引用 傳到 ClassA中而已,那這句會上天的語句是不是很好解釋了呢。

       classAInterface.method_from_interface();
相當於  ClassB@3ddb8962.method_from_interface();

這是不是跟最上面到的程式碼:

        ClassB classB = new ClassB();    
        classB.method_from_classB();

一樣呢,這也是為什麼我最開始要舉這個例子的原因!!!

相信看到這裡應該理解了介面的回撥是怎麼回事了吧。
但有一點又糊塗了,為什麼 要介面回撥這麼麻煩的,最上面的在ClassA裡面執行:

        ClassB classB = new ClassB();    
        classB.method_from_classB();

不是照樣可以 ClassA 呼叫 ClassB 裡面的 方法。。。。但要是ClassA 要呼叫ClassC,ClassD ...,裡面的方法呢,是不是還要改變ClassA裡面的程式碼,例項化ClassC,ClassD ... 的物件,顯然是不好的,要是使用介面那就不用改變ClassA 裡面的程式碼了
,任何類只要實現ClassA 裡面的介面就可以.

解釋一下 標記@1 :
上面那段話好像跟 標記@1 違背了,在 ClassA 裡面確實也需要例項化 ClassB物件。
因為要 【利用】 初始化的時候執行構造方法裡面的程式碼:

public ClassB(){
        // 相當於回撥事件的註冊,初學者出現回撥空指標很有可能這邊忘記‘註冊’了
        new ClassA().RegisterInterface(this);
    }

將this 傳遞給 ClassA ,作用也就是 上面利用 日誌分析的作用。

但再 Android 開發中救你不必這樣了,
可以在 Activity 的初始化時執行:

@Override
    protected void onCreate(Bundle savedInstanceState) {

         // 相當於回撥事件的註冊,初學者出現回撥空指標很有可能這邊忘記‘註冊’了
        new ClassA().RegisterInterface(this);
}

在Android 開發中 ClassA 裡面的 mian() 函式可以用事件來代替,觸發:
如:

button.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO 自動生成的方法存根
                if(classAInterface != null){
                classAInterface.method_from_interface();
            }
        });
}        

相關推薦

Android介面事件

看見網上一些回撥的解釋都很複雜的,特別基於Android的自定義回撥,感覺一頭霧水,於是乎,我也寫了這篇基於我對回撥的解釋。 先來看一個簡單的例子: 有兩個類 ClassA ,和 ClassB, ClassA呼叫ClassB裡面的方法, public class Cla

Android 介面實現Fragment的跳轉

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

Android介面傳遞資料

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

弄明白Android 介面機制

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

Android 介面機制詳解

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

關於 android 介面的一點思考,

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

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

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

Android 介面機制

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

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中Recyclerview使用7----條目中按鈕點選事件,在activity中呼叫(介面)

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

對於Android介面機制的理解

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

Android : Recyclerview的使用以及介面

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

Android http請求使用介面

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

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

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

介面實現RecyclerView的條目點選事件

1.介面卡中新增如下程式碼 public interface OnItemClickListener { public void onItemClick(int postion); } OnItemClickListener mClickListener; pu

android 萬能介面

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

通過介面方式來設定RecyclerView的條目點選監聽事件

提到RecyclerView大家總會拿它與ListView相比較, RecyclerView是具有比ListView更具擴充套件性的控制元件, RecyclerView繼承的是ViewGroup, 可以說也是ViewGroup的官方定義控制元件, Recycle

Android通過介面來實現資料更新(Kotlin版)

最近開發一個專案,用的是kotlin,本人kotlin水平有限,還請諒解,需要在fragment修改資料,然後更新到activity中,我使用介面回撥來完成這個需求。 先上一張圖來看一下 修改完暱稱,不僅要在fragment裡更新資料,還要同步更新act

Android 抽象函式以及介面更新UI

回撥函式使用,使得程式碼變得部分跟不變部分更加明顯,程式碼整體上有一個質的提升。 我是用抽象類裡寫的抽象回撥函式,通過通知註冊介面形式,可以隨時傳遞資料,接受資料。 同時我用介面函式回撥更新UI。下面