@Override public void onIceCandidate(final IceCandidate candidate) { synchronized (iceCandidateEvent) { Log.d(TAG, "IceCandidate #" + iceCandidates.size() + " : " + candidate.toString()); if (loopback) { // Loopback local ICE candidate in a separate thread to avoid adding // remote ICE candidate in a local ICE candidate callback. signalingExecutor.execute( new Runnable() { @Override public void run() { pcClient.addRemoteIceCandidate(candidate); } }); } iceCandidates.add(candidate); iceCandidateEvent.notifyAll(); } }