Androidのコールバック事件の詳細
ネット上のいくつかの回答の説明はすべてとても複雑で、特にAndroidのユーザー定義の返答に基づいて、霧のような感じがします。
まず簡単な例を見てみます。
二つのクラスのクラスクラスクラスのクラスAとクラスBがあります。クラスAはクラスBの中の方法を呼びます。
…0…1…2…3…4…5…6…7…8…9
私の知能指数を侮辱しているのではないですか?ほほほ、比較をするために、次に利用回調を見てみます。Class AはどのようにClass Bの中の方法を呼んでいますか?注意してください。
クラスBにクラスA定義を実現させるインターフェース
…0…1…2…3…4…5…6…7…8…9
整理して、つまり私はクラスAでインターフェースを定義しました。インターフェースの中でもう一つの方法を定義しましたが、方法体がなくて、何もしません。
Class Aがmian()関数を実行すると、インターフェースの方法を呼び出しますが、前に述べたように、インターフェースの方法は具体的なことを実現していないので、Class Bの対応方法を見つけて、具体的なことを実現します。
ユウユウよ、クラスAのインタフェースの方法はどうやってクラスBの方法を見つけたら天に昇るのですか?
つまり、このコードはどのように天に昇るかを分析します。
//インターフェースのフィードバックを利用して、クラスBの中の方法の具体的なことを実現します。
最初の(クラスAでの方法):
…a_インターフェース…ClassB@3ddb8962
二つ目:
…クラスB…ClassB@3ddb8962
三つ目:
…クラスメイトface…ClassB@3ddb8962
ここを見て、はっと悟りましたか?出力は全部「ClassB@3ddb8962つまりクラスBの対象の引用です!!!
あ!インターフェースはただClass Bの対象の引用をクラスAに伝えただけです。これは天に昇る語句で説明しやすいですか?
classAInter face.method_fromインターフェース()
に相当する [email protected]_fromインターフェース()
これは一番上のコードですか?
ここを見たら、インターフェースのフィードバックはどういうことか分かりますよね。
しかし、もうちょっと迷ってしまいました。なぜインターフェースのフィードバックがこんなに面倒なのですか?一番上のはクラスAで行います。
タグ@1を説明します。
上の話はマーク@1と違っているようです。クラスAにも確かにClass Bオブジェクトが必要です。
初期化の時に構造方法のコードを実行するからです。
しかし、Androidの開発では、あなたを救う必要はありません。
Activityの初期化時に実行できます。
例えば:
まず簡単な例を見てみます。
二つのクラスのクラスクラスクラスのクラス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();
}
});