2017-12-28 14 views
0

Ich versuche, Schnittstellen in meinem Android Java-Projekt zu verwenden. Callback-Interfaces scheinen die Antwort auf C# -Teilnehmer zu sein, aber ich kann mich nicht damit herumschlagen, ich habe andere ähnliche Fragen gelesen, aber ich kann es nicht wieder an meine Bedürfnisse anpassen oder es zum Laufen bringen. Was ich brauche, ist eine Funktion in der Klasse A zu nennen, die in der Klasse B übergeben als Parameter ist, wenn die Klasse B eine Aufgabe beendet hat, gibt das Ergebnis an A durch Aufruf die Funktion zuvor in einer Variablen gespeichert:Delegierte - wie?

class A { 

    B myBClass; 

    public A() { 
     myBClass = new B(); 
     myBClass.doSomething(ResultFunction); 
     //Continue doing other tasks 
    } 

    public void ResultFunction(<result parameters>) { 
     //do something with the result from the task in myBClass 
    } 

} 

class B { 

    Function myCallback; 

    public B() { 

    } 

    public void doSomething(ResultFunction) { 
     myCallback = callback; 
     //does something 
     SomethingFinished(); 
    } 

    private void SomethingFinished() { 
     myCallback.call(<result of doSomething>); 
    } 

} 
+0

Können Sie nicht einfach Methode 'DoSomething' aus' ClassB' die Ergebnisse zurückgeben, damit Sie Ihre eigene Methode von A aufrufen können? –

Antwort

1

es gibt zwei Möglichkeiten, es zu tun:

1) Verwenden sie anonyme Klasse:

entfernen ResultFunction Argument von doSomething Methode in der Klasse B

Und reimplementieren es in der Klasse A

public A() { 
     myBClass = new B() { 
      @Override 
      public void doSomething() { 
       super.doSomething(); 
       //do here what you need what you want to do in B class 
      } 
     } 
     myBClass.doSomething(); 
     //Continue doing other tasks 
    } 

2) Verwenden Sie Callable Schnittstelle

interface Callable { 
    public void call(); 
} 

Pass es statt ResultFunction

class A { 

    B myBClass; 
    Callable callable = new Callable { 
     @Override 
     public void call() { 
      //do here what you need what you want to do in B class 
     } 
    } 

    public A() { 
     myBClass = new B(); 
     myBClass.doSomething(callable); 
     //Continue doing other tasks 
    } 

} 

class B { 

    Callable myCallback; 

    public B() { 

    } 

    public void doSomething(Callable callable) { 
     myCallback = callable; 
     //does something 
     SomethingFinished(); 
    } 

    private void SomethingFinished() { 
     myCallback.call(); 
    } 

} 

Mit lambdas es wie ein bisschen besser aussehen können

public A() { 
     myBClass = new B(); 
     myBClass.doSomething(()->{ 
      //do here what you need what you want to do in B class 
     }); 
     //Continue doing other tasks 
    } 
0

Ich verstehe nicht, warum Sie können nicht nur Folgendes tun:

public class A { 

    private B myBClass; 

    public A() { 
     myBClass = new B(); 
     Result result = myBClass.doSomething(); 
     resultFunction(result) 
     //Continue doing other tasks 
    } 

    public void resultFunction(Result result) { 
     //do something with the result from the task in myBClass 
    } 

} 

public class B { 

    public B() { 

    } 

    public Result doSomething() { 
     //does something 
    } 
} 

Wenn aus welchem ​​Grund auch immer, die Sie tun müssen, können Sie es leicht in Java 8 wie folgt tun:

public class A { 

    B myBClass; 

    public A() { 
     myBClass = new B(); 
     myBClass.doSomething(A::resultFunction); 
     //Continue doing other tasks 
    } 

    public void resultFunction(Result result) { 
     //do something with the result from the task in myBClass 
    } 

} 

public class B { 

    private Consumer<Result> myCallback; 

    public B() { 

    } 

    public void doSomething(Consumer<Result> callback) { 
     myCallback = callback; 
     //does something 
     myCallback.accept(result); 
    } 

}