Androidのコールバック事件の詳細


ネット上のいくつかの回答の説明はすべてとても複雑で、特にAndroidのユーザー定義の返答に基づいて、霧のような感じがします。
まず簡単な例を見てみます。
二つのクラスのクラスクラスクラスのクラスAとクラスBがあります。クラスAはクラスBの中の方法を呼びます。

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
私の知能指数を侮辱しているのではないですか?ほほほ、比較をするために、次に利用回調を見てみます。Class AはどのようにClass Bの中の方法を呼んでいますか?注意してください。
クラスBにクラスA定義を実現させるインターフェース

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);
  }*/
}

クラスAでインターフェースと抽象的な方法を定義します。

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
整理して、つまり私はクラスAでインターフェースを定義しました。インターフェースの中でもう一つの方法を定義しましたが、方法体がなくて、何もしません。
Class Aがmian()関数を実行すると、インターフェースの方法を呼び出しますが、前に述べたように、インターフェースの方法は具体的なことを実現していないので、Class Bの対応方法を見つけて、具体的なことを実現します。
ユウユウよ、クラスAのインタフェースの方法はどうやってクラスBの方法を見つけたら天に昇るのですか?
つまり、このコードはどのように天に昇るかを分析します。
//インターフェースのフィードバックを利用して、クラスBの中の方法の具体的なことを実現します。 classAInterface.method_from_interface();上記のコードの中でSystem.out.printlnでログを印刷して分析しました。
最初の(クラスAでの方法):

  public void RegisterInterface(ClassAInterface a_interface){

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

出力:
…a_インターフェース…ClassB@3ddb8962
二つ目:

public ClassB(){
    
    new ClassA().RegisterInterface(this);
    System.out.println("...ClassB..."+this);
  }
出力:
…クラスB…ClassB@3ddb8962
三つ目:

System.out.println("...classAInterface..."+classAInterface);
     if(classAInterface != null){
        classAInterface.method_from_interface();
      }
出力:
…クラスメイトface…ClassB@3ddb8962
ここを見て、はっと悟りましたか?出力は全部「ClassB@3ddb8962つまりクラスBの対象の引用です!!!
あ!インターフェースはただClass Bの対象の引用をクラスAに伝えただけです。これは天に昇る語句で説明しやすいですか?
       classAInter face.method_fromインターフェース()
に相当する  [email protected]_fromインターフェース()
これは一番上のコードですか?

    ClassB classB = new ClassB();  
    classB.method_from_classB();
これもなぜ最初にこの例を挙げたのですか?
ここを見たら、インターフェースのフィードバックはどういうことか分かりますよね。
しかし、もうちょっと迷ってしまいました。なぜインターフェースのフィードバックがこんなに面倒なのですか?一番上のはクラスAで行います。

    ClassB classB = new ClassB();  
    classB.method_from_classB();
それともクラスAでクラスBの中の方法を呼び出すことができますか?しかし、Class AがClass C、クラスDを呼び出すと、中の方法は、Class Aのコードを変更する必要がありますか?Class C、Class D...のオブジェクトは、明らかに悪いです。インターフェースを使用するなら、クラスAのコードを変更する必要はありません。どのクラスもClass Aの中のインターフェースを実現すればいいです。
タグ@1を説明します。
上の話はマーク@1と違っているようです。クラスAにも確かにClass Bオブジェクトが必要です。
初期化の時に構造方法のコードを実行するからです。

public ClassB(){
    //           ,                  ‘  ' 
    new ClassA().RegisterInterface(this);
  }
thisをClass Aに渡すということは、日誌を使って分析するということです。
しかし、Androidの開発では、あなたを救う必要はありません。
Activityの初期化時に実行できます。

@Override
  protected void onCreate(Bundle savedInstanceState) {

     //           ,                  ‘  ' 
    new ClassA().RegisterInterface(this);
}

Android開発において、Class Aの中のmian関数はイベントで代替できます。トリガ:
例えば:

button.setOnClickListener(new OnClickListener() {
      
      @Override
      public void onClick(View v) {
        // TODO          
        if(classAInterface != null){
        classAInterface.method_from_interface();
      }
    });