Skip to content

Commit 5aa7b3e

Browse files
stratomdaJulian Cerruti
authored and
Julian Cerruti
committed
This closes rosjava#233. Adds fix for shutting down DefaultNodeMainExecutor ListenerGroup to prevent leak in android when activities are destroyed. Added ability to remove listener from ListenerGroup to fix android_core issue rosjava#254.
1 parent c860695 commit 5aa7b3e

File tree

5 files changed

+37
-0
lines changed

5 files changed

+37
-0
lines changed

rosjava/src/main/java/org/ros/concurrent/EventDispatcher.java

+5
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,9 @@ public void loop() throws InterruptedException {
4242
SignalRunnable<T> signalRunnable = events.takeFirst();
4343
signalRunnable.run(listener);
4444
}
45+
46+
public T getListener()
47+
{
48+
return listener;
49+
}
4550
}

rosjava/src/main/java/org/ros/concurrent/ListenerGroup.java

+20
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,25 @@ public Collection<EventDispatcher<T>> addAll(Collection<T> listeners) {
101101
return addAll(listeners, DEFAULT_QUEUE_CAPACITY);
102102
}
103103

104+
/**
105+
* Removes and cancels the {@EventDispatcher} specified by the listener
106+
* from the {@link ListenerGroup}.
107+
* @param listener the listener to remove
108+
* @return flag indicating successful removal
109+
*/
110+
public boolean remove(T listener)
111+
{
112+
for (EventDispatcher<T> eventDispatcher : eventDispatchers) {
113+
if(listener.equals(eventDispatcher.getListener()))
114+
{
115+
eventDispatcher.cancel();
116+
eventDispatchers.remove(eventDispatcher);
117+
return true;
118+
}
119+
}
120+
return false;
121+
}
122+
104123
/**
105124
* @return the number of listeners in the group
106125
*/
@@ -151,5 +170,6 @@ public void shutdown() {
151170
for (EventDispatcher<T> eventDispatcher : eventDispatchers) {
152171
eventDispatcher.cancel();
153172
}
173+
eventDispatchers.clear();
154174
}
155175
}

rosjava/src/main/java/org/ros/internal/node/DefaultNode.java

+5
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,11 @@ public void run(NodeListener listener) {
493493
});
494494
}
495495

496+
@Override
497+
public void removeListeners() {
498+
nodeListeners.shutdown();
499+
}
500+
496501
/**
497502
* SignalRunnable all {@link NodeListener}s that the {@link Node} has started.
498503
* <p>

rosjava/src/main/java/org/ros/node/DefaultNodeMainExecutor.java

+1
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ private void registerNode(ConnectedNode connectedNode) {
213213
* the {@link Node} to unregister
214214
*/
215215
private void unregisterNode(Node node) {
216+
node.removeListeners();
216217
connectedNodes.get(node.getName()).remove(node);
217218
nodeMains.remove(node);
218219
}

rosjava/src/main/java/org/ros/node/Node.java

+6
Original file line numberDiff line numberDiff line change
@@ -126,4 +126,10 @@ public interface Node {
126126
* Shut the node down.
127127
*/
128128
void shutdown();
129+
130+
/**
131+
* Stops and Clears node listeners.
132+
*/
133+
134+
void removeListeners();
129135
}

0 commit comments

Comments
 (0)