Android examples for App:App Running
Run the supplied Callable on the main thread, wrapping any exceptions in a RuntimeException.
//package com.java2s; import android.os.Handler; import android.os.Looper; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; public class Main { private static final Object sLock = new Object(); private static boolean sWillOverride = false; private static Handler sUiThreadHandler = null; /**/*w w w . j a v a2 s . com*/ * Run the supplied Callable on the main thread, wrapping any exceptions in a RuntimeException. * The method will block until the Callable completes. * * @param c The Callable to run * @return The result of the callable */ public static <T> T runOnUiThreadBlockingNoException(Callable<T> c) { try { return runOnUiThreadBlocking(c); } catch (ExecutionException e) { throw new RuntimeException( "Error occured waiting for callable", e); } } /** * Run the supplied Runnable on the main thread. The method will block until the Runnable * completes. * * @param r The Runnable to run. */ public static void runOnUiThreadBlocking(final Runnable r) { if (runningOnUiThread()) { r.run(); } else { FutureTask<Void> task = new FutureTask<Void>(r, null); postOnUiThread(task); try { task.get(); } catch (Exception e) { throw new RuntimeException( "Exception occured while waiting for runnable", e); } } } /** * Run the supplied Callable on the main thread, The method will block until the Callable * completes. * * @param c The Callable to run * @return The result of the callable * @throws java.util.concurrent.ExecutionException c's exception */ public static <T> T runOnUiThreadBlocking(Callable<T> c) throws ExecutionException { FutureTask<T> task = new FutureTask<T>(c); runOnUiThread(task); try { return task.get(); } catch (InterruptedException e) { throw new RuntimeException("Interrupted waiting for callable", e); } } /** * @return true iff the current thread is the main (UI) thread. */ public static boolean runningOnUiThread() { return getUiThreadHandler().getLooper() == Looper.myLooper(); } /** * Post the supplied FutureTask to run on the main thread. The method will not block, even if * called on the UI thread. * * @param task The FutureTask to run * @return The queried task (to aid inline construction) */ public static <T> FutureTask<T> postOnUiThread(FutureTask<T> task) { getUiThreadHandler().post(task); return task; } public static void postOnUiThread(Runnable r) { getUiThreadHandler().post(r); } /** * Run the supplied FutureTask on the main thread. The method will block only if the current * thread is the main thread. * * @param task The FutureTask to run * @return The queried task (to aid inline construction) */ public static <T> FutureTask<T> runOnUiThread(FutureTask<T> task) { if (runningOnUiThread()) { task.run(); } else { postOnUiThread(task); } return task; } /** * Run the supplied Runnable on the main thread. The method will block only if the current * thread is the main thread. * * @param r The Runnable to run */ public static void runOnUiThread(Runnable r) { if (runningOnUiThread()) { r.run(); } else { getUiThreadHandler().post(r); } } public static Handler getUiThreadHandler() { synchronized (sLock) { if (sUiThreadHandler == null) { if (sWillOverride) { throw new RuntimeException( "Did not yet override the UI thread"); } sUiThreadHandler = new Handler(Looper.getMainLooper()); } return sUiThreadHandler; } } }