diff --git a/src/net/sf/briar/android/AndroidExecutorImpl.java b/src/net/sf/briar/android/AndroidExecutorImpl.java index fd3ac27c2bdba6fd4bd4915ed50e2072fb1ee1ec..7928e059df60f1d7ed7047f8d7938bd62cf34b7c 100644 --- a/src/net/sf/briar/android/AndroidExecutorImpl.java +++ b/src/net/sf/briar/android/AndroidExecutorImpl.java @@ -2,6 +2,7 @@ package net.sf.briar.android; import java.util.concurrent.Callable; import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.FutureTask; import java.util.concurrent.atomic.AtomicBoolean; @@ -15,7 +16,7 @@ import com.google.inject.Inject; class AndroidExecutorImpl implements AndroidExecutor { - private static final int SHUTDOWN = 0, RUNNABLE = 1, CALLABLE = 2; + private static final int SHUTDOWN = 0, RUN = 1; private final Runnable loop; private final AtomicBoolean started = new AtomicBoolean(false); @@ -45,20 +46,13 @@ class AndroidExecutorImpl implements AndroidExecutor { } } - public Future<Void> submit(Runnable r) { - startIfNecessary(); - Future<Void> f = new FutureTask<Void>(r, null); - Message m = Message.obtain(handler, RUNNABLE, f); - handler.sendMessage(m); - return f; - } - - public <V> Future<V> submit(Callable<V> c) { + public <V> V run(Callable<V> c) throws InterruptedException, + ExecutionException { startIfNecessary(); Future<V> f = new FutureTask<V>(c); - Message m = Message.obtain(handler, RUNNABLE, f); + Message m = Message.obtain(handler, RUN, f); handler.sendMessage(m); - return f; + return f.get(); } public void shutdown() { @@ -76,8 +70,7 @@ class AndroidExecutorImpl implements AndroidExecutor { case SHUTDOWN: Looper.myLooper().quit(); break; - case RUNNABLE: - case CALLABLE: + case RUN: ((FutureTask<?>) m.obj).run(); break; default: diff --git a/src/net/sf/briar/api/android/AndroidExecutor.java b/src/net/sf/briar/api/android/AndroidExecutor.java index 3066a7b24c456a31d86fb726a5451346a3448d32..b950806aae6923c92260898928220ca7cff795f3 100644 --- a/src/net/sf/briar/api/android/AndroidExecutor.java +++ b/src/net/sf/briar/api/android/AndroidExecutor.java @@ -1,7 +1,7 @@ package net.sf.briar.api.android; import java.util.concurrent.Callable; -import java.util.concurrent.Future; +import java.util.concurrent.ExecutionException; /** * Enables background threads to make Android API calls that must be made from @@ -9,9 +9,8 @@ import java.util.concurrent.Future; */ public interface AndroidExecutor { - Future<Void> submit(Runnable r); - - <V> Future<V> submit(Callable<V> c); + /** Runs the given task on a thread with a message queue. */ + <V> V run(Callable<V> c) throws InterruptedException, ExecutionException; void shutdown(); } diff --git a/src/net/sf/briar/plugins/droidtooth/DroidtoothPlugin.java b/src/net/sf/briar/plugins/droidtooth/DroidtoothPlugin.java index f93708e21c0297f2925b2343235fa1fd6ab23945..3d53d5595d574a7e223f526c7a7330e679802888 100644 --- a/src/net/sf/briar/plugins/droidtooth/DroidtoothPlugin.java +++ b/src/net/sf/briar/plugins/droidtooth/DroidtoothPlugin.java @@ -23,7 +23,6 @@ import java.util.concurrent.Callable; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor; -import java.util.concurrent.Future; import java.util.logging.Logger; import net.sf.briar.api.ContactId; @@ -89,14 +88,12 @@ class DroidtoothPlugin implements DuplexPlugin { public void start() throws IOException { // BluetoothAdapter.getDefaultAdapter() must be called on a thread // with a message queue, so submit it to the AndroidExecutor - Callable<BluetoothAdapter> c = new Callable<BluetoothAdapter>() { - public BluetoothAdapter call() throws Exception { - return BluetoothAdapter.getDefaultAdapter(); - } - }; - Future<BluetoothAdapter> f = androidExecutor.submit(c); try { - adapter = f.get(); + adapter = androidExecutor.run(new Callable<BluetoothAdapter>() { + public BluetoothAdapter call() throws Exception { + return BluetoothAdapter.getDefaultAdapter(); + } + }); } catch(InterruptedException e) { throw new IOException(e.toString()); } catch(ExecutionException e) {