sPFLib/src/main/java/it/polimi/spf/lib/LooperUtils.java
public static <E> E onMainThread(Class<E> callbackInterface, final E callback) {
		Utils.notNull(callbackInterface, "callbackInterface must not be null");
		Utils.notNull(callback, "callback must not be null");

		final Handler handler = new Handler(Looper.getMainLooper());
		final String tag = callback.getClass().getSimpleName();

		Object proxy = Proxy.newProxyInstance(callbackInterface.getClassLoader(), new Class<?>[] { callbackInterface }, new InvocationHandler() {

			@Override
			public Object invoke(Object proxy, final Method method, final Object[] args) throws Throwable {
				handler.post(new Runnable() {

					@Override
					public void run() {
						try {
							method.invoke(callback, args);
						} catch (IllegalAccessException e) {
							Log.e(tag, "Error executing method " + method.getName() + " on main thread.", e);
						} catch (IllegalArgumentException e) {
							Log.e(tag, "Error executing method " + method.getName() + " on main thread.", e);
						} catch (InvocationTargetException e) {
							Log.e(tag, "Error executing method " + method.getName() + " on main thread.", e);
						}
					}
				});

				return null;
			}
		});

		return callbackInterface.cast(proxy);
	}
public static <E> E onMainThread(Class<E> callbackInterface, final E callback) {
		Utils.notNull(callbackInterface, "callbackInterface must not be null");
		Utils.notNull(callback, "callback must not be null");

		final Handler handler = new Handler(Looper.getMainLooper());
		final String tag = callback.getClass().getSimpleName();

		Object proxy = Proxy.newProxyInstance(callbackInterface.getClassLoader(), new Class<?>[] { callbackInterface }, new InvocationHandler() {

			@Override
			public Object invoke(Object proxy, final Method method, final Object[] args) throws Throwable {
				handler.post(new Runnable() {

					@Override
					public void run() {
						try {
							method.invoke(callback, args);
						} catch (IllegalAccessException e) {
							Log.e(tag, "Error executing method " + method.getName() + " on main thread.", e);
						} catch (IllegalArgumentException e) {
							Log.e(tag, "Error executing method " + method.getName() + " on main thread.", e);
						} catch (InvocationTargetException e) {
							Log.e(tag, "Error executing method " + method.getName() + " on main thread.", e);
						}
					}
				});

				return null;
			}
		});

		return callbackInterface.cast(proxy);
	}
Wraps a callback into a proxy that executes its methods on the main
thread. Return types are not supported, a method with return type other
than void always returns null when called on the proxy.

@param callbackInterface
- the interface of the callback.
@param callback
- the callback implementation
@return the proxy to execute methods on the main thread.