diff --git a/talk/app/webrtc/java/android/org/webrtc/ThreadUtils.java b/talk/app/webrtc/java/android/org/webrtc/ThreadUtils.java index 5e6cc52895..33402f700b 100644 --- a/talk/app/webrtc/java/android/org/webrtc/ThreadUtils.java +++ b/talk/app/webrtc/java/android/org/webrtc/ThreadUtils.java @@ -27,6 +27,9 @@ package org.webrtc; +import android.os.Handler; + +import java.util.concurrent.Callable; import java.util.concurrent.CountDownLatch; final class ThreadUtils { @@ -100,4 +103,27 @@ final class ThreadUtils { } }); } + + /** + * Post |callable| to |handler| and wait for the result. + */ + public static V invokeUninterruptibly(final Handler handler, final Callable callable) { + class Result { + public V value; + } + final Result result = new Result(); + final CountDownLatch barrier = new CountDownLatch(1); + handler.post(new Runnable() { + @Override public void run() { + try { + result.value = callable.call(); + } catch (Exception e) { + throw new RuntimeException("Callable threw exception: " + e); + } + barrier.countDown(); + } + }); + awaitUninterruptibly(barrier); + return result.value; + } }