Android – Events the easy (AS3) way

I like the EventDispatcher class from ActionScript 3 so I decided to write one for Java.
Usage

1
2
3
4
5
6
7
foo.addEventListener("MyEvent", new EventListener() {
    public void run(Event event) {
        // remove the listener if no longer needed
        event.target.removeEventlistener(event.type, this);
        // do stuff
    }
}

Now your class can either extend EventDispatcherImp or implement EventDispatcher and you’re ready to dispatch events.

Via inheritance

1
2
3
import com.wumedia.events.EventDispatcher.EventDispatcherImpl;
public class Dispatcher extends EventDispatcherImpl {
}

Via composition

1
2
3
4
5
6
import com.wumedia.events.EventDispatcher.EventDispatcherImpl;
public class Dispatcher implements EventDispatcher {
    public Dispatcher() {
        _dispatcher = new EventDispatcherImpl(this);
    }
}

Here are the 3 required classes,
The Event

1
2
3
4
5
6
7
8
package com.wumedia.events;
public class Event {	
	public String type;
	public EventDispatcher target;	
	public Event(String type) {
		this.type = type;
	}
}

The Listener

1
2
3
4
package com.wumedia.events;
public abstract interface EventListener {
	public void run(Event event);
}

The Dispatcher

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package com.wumedia.events;
 
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
 
public interface EventDispatcher {
 
	/**
	 * Register an event listener
	 * @param type		String the name of the event to listen to
	 * @param listener	EventListener the listener
	 */
	public void addEventListener(String type, EventListener listener);
	/**
	 * Unregister an event listener
	 * @param type		String the name of the event registered to
	 * @param listener	EventListener the listener
	 */
	public void removeEventlistener(String type, EventListener listener);
	/**
	 * Remomve all listeners
	 */
	public void removeAllListeners();
	/**
	 * Dispatch an Event
	 * @param event	Event
	 */
	public void dispatchEvent(Event event) ;
	/**
	 * Query to see if there are any listeners registered to a certain event name
	 * @param type	String the event name to query
	 * @return	boolean
	 */
	public boolean willTrigger(String type);
 
 
	public class EventDispatcherImpl implements EventDispatcher {
		protected HashMap<string , ArrayList<EventListener>> _listenersMap;
		protected EventDispatcher _eventTarget;
 
		/**
		 * Constructor - intended for inheritance
		 */
		public EventDispatcherImpl() {
			removeAllListeners();
		}
 
		/**
		 * Constructor - intended for composition
		 * @param eventTarget EventListener to use as the event target in the Event sent
		 */
		public EventDispatcherImpl(EventDispatcher eventTarget) {
			_eventTarget = eventTarget;
		}
 
		public void addEventListener(String type, EventListener listener) {
			removeEventlistener(type, listener);
			ArrayList<eventlistener> listeners = _listenersMap.get(type);
			if ( listeners == null ) {
				listeners = new ArrayList</eventlistener><eventlistener>();
				_listenersMap.put(type, listeners);
			}
			listeners.add(listener);
		}
 
		public void removeEventlistener(String type, EventListener listener) {
			ArrayList</eventlistener><eventlistener> listeners = (ArrayList</eventlistener><eventlistener>) _listenersMap.get(type);
			if ( listeners != null ) {
				Iterator</eventlistener><eventlistener> items = listeners.iterator();
		        while( items.hasNext() ) {
		            if ( (EventListener) items.next() == listener ) {
		            	items.remove();
		            	return;
		            }
		        }
		        if ( listeners.isEmpty() ) {
		        	_listenersMap.remove(type);
		        }
			}
		}
 
		public void removeAllListeners() {
			_listenersMap = new HashMap<string , ArrayList<EventListener>>();
		}
 
		public void dispatchEvent(Event event) {
			ArrayList<eventlistener> listeners = (ArrayList</eventlistener><eventlistener>) _listenersMap.get(event.type);
			if ( listeners != null ) {
				event.target = _eventTarget != null ? _eventTarget : this;
				Iterator</eventlistener><eventlistener> items = listeners.iterator();
		        while( items.hasNext() ) {
		            ( (EventListener) items.next() ).run(event);
		        }
			}
		}
 
		public boolean willTrigger(String type) {
			ArrayList</eventlistener><eventlistener> listeners = (ArrayList</eventlistener><eventlistener>) _listenersMap.get(type);
			return listeners == null || listeners.isEmpty();
		}
	}
}
 
 
 
 
 
</eventlistener></string></eventlistener></string>

3 Responses to “Android – Events the easy (AS3) way”

  1. Paula says:

    this is way cool. very impresssed.

  2. hawaiiantime says:

    really nice work!!
    i always wanted this, definitely use these classes for my next project.
    thanks! :)

Leave a Reply