2017-05-15 4 views
2

Meine Frage ziemlich nah an Java notify/Observer Entwurfsmuster. Ich habe in verschiedenen Java/Android-Programmen gearbeitet. Eine Sache, die ich verstehen wollte, ist, wie Publisher wissen, was die Klasse ist, die die gegebene Schnittstelle implementiert. Wenn beispielsweise in Android die Kamera bereit ist, wird eine Methode aufgerufen, wenn Sie eine bestimmte Schnittstelle implementieren. Wie Android ruft diese Methode Methode, wenn die Kamera ohne Registrierung meiner Klasse zu Android öffnen.Wie bekomme ich die Implementierung Schnittstelle Klasse in Java

class mydevice implements camerainterface{ 

    public void cameraup(){ 
    // Implementing my logic when camera up. How android know that there is class //mydevice which is implementing my interface 
    } 

} 

Wie Android meine Klasse mydevice kennen und diese Kameraaufrufmethode aufrufen.

Ich hoffe, erklärte ich meine Frage im Detail zu verstehen.

+0

In Java können Sie 'if (myObject instanceof FooInterface)' ausführen, um festzustellen, ob ein Objekt eine Schnittstelle implementiert. – Nathan

+1

Er fragt, wie das zugrundeliegende System weiß, dass es seine Klasse aufrufen muss, weil es die Schnittstelle implementiert –

+0

@TimCastelijns Die Frage ist dann auf der Zuordnung? Ähnlich wie die web.xml in einer Webanwendung? – Nathan

Antwort

-1

Wie android meine Klasse mydevice und dem Aufruf dieser Methode cameraup wissen?

Aufwarten Sie fragen, wie sieht Ihre JVM wissen Ihre Klasse implementiert cameraInterface, könnten sie einfach verwenden, um die instanceof Schlüsselwort, so etwas wie if (myDeviceObject instanceof cameraInterface).

EDIT Wie es scheint, was Sie fragen mehr einer Konfiguration Frage ist:

Sie einen Blick auf this link nehmen sollte, wo es, dass

Sie entweder dynamisch ein Register kann festgestellt ist Instanz dieser Klasse mit Context.registerReceiver() oder deklarieren Sie eine Implementierung mit dem Tag in Ihrer AndroidManifest.xml.

Nun, dies zusammenfassend ziemlich gut, wie Klassenregistrierung in Android funktioniert. Entweder Sie registriert die Klasse von Context, Ihr Framework hat es für Sie, oder es ist definiert in AndroidManifest.xml

Für die „Ihr Rahmen hat es für Sie“ Teil: Sie sollten für Dependency Injection suchen und Annotation zur Injektion. Es kann verwendet werden, um dem Compiler anzuzeigen, dass es die Klassen scannen sollte, um eine Implementierung der Schnittstelle zu finden.

+0

Meinst du, JVM scannt alle Klassen im Jar, um herauszufinden, welche Klasse welche Oberflächen implementiert und registriert hat? – rajeswaran

+0

Hinzufügen von mehr, zum Beispiel habe ich eine API und dort eine Schnittstelle in dieser API namens weatherupdate, die abstrakte Methode changeweather() hat entwickelt. Wenn jemand wissen möchte, dass Wetter sich ändert, muss er die Wetterupdate-Update-Klasse und die Changeweather (int c) -Methode implementieren. Wie muss ich alle Klassen benachrichtigen, wo auch immer meine Schnittstelle implementiert ist und ihnen Updates zur Verfügung stellen. Ich möchte nicht, dass sie ihre Klasse wie set_listener registrieren. einfach meine Schnittstelle implementieren, die bei jedem Wetter aufgerufen wird. – rajeswaran

0

Nun, wenn ich Ihre Frage richtig verstehe, mischen Sie Schnittstelle und Rundfunk.

Grob ist eine Schnittstelle nie bewusst, welche Klassen es implementieren.

Wenn Sie myDevice erstellen, die implementiert sagen cameraInterface wird dies nichts tun, solange Android nicht bewusst ist, dass es etwas mit dieser Klasse zu tun hat. Es wird einen Punkt geben, an dem Sie Android mitteilen müssen, mit welcher Klasse Sie arbeiten möchten, andernfalls wird der Inhalt niemals ausgelöst.

Broadcasting ist, wenn Sie Android sagen "gibt es diese Klasse, die ein Ereignis kennen muss. Trigger es ist eine spezielle Methode, wenn dieses Ereignis eintritt.". Wenn Sie beispielsweise Code beim Öffnen der Kamera auslösen möchten (ich glaube nicht, dass dies möglich ist, aber dies ist nur ein Beispiel), müssen Sie Ihre Klasse als BroadcastReceiver deklarieren und in der Manifest.xml angeben, welche Ereignisse, die es hören soll.

+0

* Wenn Sie myDevice erstellen, das say cameraInterface implementiert, wird dies nichts tun, solange Android nicht weiß, dass es etwas mit dieser Klasse zu tun hat. * Er fragt, wie Android dies weiß, nicht was für eine Schnittstelle oder Broadcast ist –

+0

Nach den Kommentaren, das ist etwas, was OP muss bewusst sein, wie das scheint nicht ganz klar zu sein. –

+0

was meinst du mit "this" und "that"? –

1

Im Beobachtermuster definiert der Publisher den Vertrag (Interface und seine Methoden) basierend auf der Anforderung, nicht der Abonnent. Teilnehmer implementieren die Schnittstelle und registrieren sich selbst als Teilnehmerobjekte.

Aber in Ihrem Fall sind Sie der Abonnent und Sie versuchen, den Vertrag (Kamerainterface) zu definieren, der kein Beobachtermuster ist.

Zuerst müssen Sie überprüfen, welche Broadcast oder Callbacks Android (in unserem Fall Publisher) für Ihre Anforderung und Sie müssen diesen Vertrag als Register als Abonnent implementieren.

Hoffe, das hilft.

+0

Danke für die Antwort, lassen Sie mich als meine Frage spezifischer .https: //developer.android.com/reference/ android/hardware/Camera.PreviewCallback.html. In der Verbindung habe ich eine Schnittstelle Camera.PreviewCallback als Beispiel genommen. Diese Schnittstelle hat eine Methode namens onPreviewFrame (byte [] data, Kamera Kamera). Diese Methode wird aufgerufen, wenn sich die Vorschau des Kamera-Bildschirms ändert. Wie ich meine Arbeit programmiere, nur um diese Schnittstelle und Methode zu implementieren. Wann immer sich der Kamerarahmen ändert, wird er ausgeführt. Nichts anderes mache ich. Meine Frage ist, wie Android weiß, dass ich diese Schnittstelle implementiert habe und meine Methode aufrufen. – rajeswaran

+0

1) Um mit android.hardware.Camera und seiner Apis zu arbeiten, müssen wir die Methode open (int cameraId) und das Objekt camera (ex: cameraObject) aufgerufen haben. 2) Kamera ausgesetzt eine Methode setPreviewCallback (Camera.PreviewCallback), die jedes Objekt vom Typ Camera.PreviewCallback übernimmt. In Schritt 1 hatten wir bereits einen Verweis auf Kamera und wir können unser Clientobjekt registrieren, das Camera.PreviewCallback mit cameraObject.setPreviewCallback (Camera.PreviewCallback) implementiert. Dies ist der Ort, an dem wir unseren Kunden Kamera-Hardware abonniert haben. Hier ist android.hardware.Camera der Publisher. – Hanman

0

Ihre Frage scheint mir ziemlich breit zu sein, also werde ich versuchen, einen anderen Weg zu gehen. Das Konzept, auf das Sie sich beziehen, ist nicht Java-spezifisch. Im Allgemeinen gilt dies immer dann, wenn Sie virtuelle Verweise auf Objekte übergeben und zur Laufzeit vom Compiler verarbeitet werden.

Was passiert ist, dass jedes Mal, wenn Sie eine Referenz als Schnittstelle übergeben (oder eine abstrakte Elternklasse), die Referenz des konkreten Objekts in einer virtuellen Nachschlagetabelle oder vtable gespeichert wird.

Werfen Sie einen Blick auf this

Also, wenn ein Publisher ein Ereignis auslöst, wird der Verweis auf die konkreten Gegenstand des Verlegers in einer V-Tabelle gespeichert sind, und auch für den Betrachter als Schnittstelle übergeben wird. Sie können sich Schnittstelle als nichts anderes als einen Zeiger auf das eigentliche Objekt vorstellen.

Verwandte Themen