Eigene EventListener in Android entwickeln

Ich schreibe mit einem Kumpel an einer kleinen App. Für ein bestimmtes Feature benötigten wir einen eigenen EventListener. Die Implementierung dessen möchte ich folgend beschreiben.

Um das System dahinter zu verdeutlichen, müssen wir uns dazu keine extra App vorstellen, denn die App-Entwicklung für Android basiert auf Java. In dem folgenden Beispiel nutzen wir eine Calculator-Klasse, welche ein paar einfache Rechenoperationen durchführen soll. Das Ergebnis wollen wir dann per onFinished-Event ausgeben lassen.

Die main-Klasse

Die von mir genutzte Main-Klasse würde in einer Android-App die entsprechende Activity darstellen, welche von dem onFinished-Event Gebrauch machen möchte.

import tools.Calculator;
import tools.EventListener;

public class main {

    public static void main(String[] args) {

        Calculator calc = new Calculator();

        calc.setOnFinishedEventListener(new EventListener() {

            @Override
            public void onFinished(Object result) {

                System.out.println("Result: "+String.valueOf((int)result));

            }

        });

        calc.calculate(5,5,Calculator.PLUS);

    }

}

In dieser Activity bzw. Klasse erzeugen wir ein Objekt der Calculator Klasse. Diesem Objekt weisen wir über calc.setOnFinishedEventListener(…) unser EventListener-Objekt, in welchem wir die onFinished Methode überschreiben. In dieser Methode geben wir das Ergebnis einfach als String aus.

Wichtig ist, dass wir den EventListener vor der Berechnung selbst setzen. Andernfalls würde es zu keinem Event kommen, da wir in der Calculator-Klasse dieses nach der Berechnung abfeuern.

EventListener.java

Um einen EventListener umzusetzen, müssen wir ein entsprechendes Interface erstellen. Dieses Inferface enthält die Methode onFinished, welche wir weiter oben überschrieben haben.

package tools;

public interface EventListener {

    void onFinished(Object result);

}

 

Calculator.java

In der Calculator.java, in welcher später das Event abgefeuert werden soll, muss eine Funktion implementiert werden, welche den EventListener setzt. Zunächst weist man der Klasse eine neue private Variable, welche den EventListener enhält, zu. Wir brauchen nun nur noch eine Setter-Methode, um den EventListener zu setzen:

package tools;

public class Calculator {

    public static final int PLUS = 0;
    public static final int MINUS = 1;
    public static final int DIV = 2;
    public static final int MULT = 3;

    private int _result;
    private EventListener _eListener = null;

    public void calculate(int x, int y, int op) {

        switch(op) {
            case PLUS: {
                _result = x + y;               
            }
            case MINUS: {
                _result = x - y;
            }
            case DIV: {
                _result = x / y;
            }
            case MULT: {
                _result = x * y;
            }
            default: {
                _result =  x + y;
            }

        }

        if(_eListener != null)
            _eListener.onFinished(_result);

    }

    public void setOnFinishedEventListener(EventListener listener) {
        _eListener = listener;
    }

}

Wie man erkennen kann, ruft man zum abfeuern des Events einfach an der gewünschten Stelle die onFinished-Funktion auf. Dies macht allerdings nur Sinn, falls diese nicht null ist.

Fazit

Man kann sehr einfach eigene EventListener umsetzen, um bestimmte Funktionalitäten – meistens in parallelem bzw. asynchronen Code – zu programmieren.

~ Sebastian