package com.squareup.otto; import android.app.Activity; import android.os.Handler; import android.os.Looper; import java.lang.reflect.InvocationTargetException; import me.barrasso.android.volume.LogUtils; public class MainThreadBus extends Bus { private static Bus BUS; public synchronized static Bus get() { if (null == BUS) BUS = new MainThreadBus(ThreadEnforcer.ANY); return BUS; } public MainThreadBus(ThreadEnforcer enforcer) { super(enforcer); } private final Handler mHandler = new Handler(Looper.getMainLooper()); @Override public void post(final Object event) { if (Looper.myLooper() == Looper.getMainLooper()) { super.post(event); } else { mHandler.post(new Runnable() { @Override public void run() { MainThreadBus.super.post(event); } }); } } public void postSafely(final Object event) { if (Looper.myLooper() == Looper.getMainLooper()) { try { super.post(event); } catch (Throwable t) { LogUtils.LOGE("Bus", "Error in posting object.", t); } } else { mHandler.post(new Runnable() { @Override public void run() { try { MainThreadBus.super.post(event); } catch (Throwable t) { LogUtils.LOGE("Bus", "Error in posting object.", t); } } }); } } /** * Dispatches {@code event} to the handler in {@code wrapper}. This method is an appropriate override point for * subclasses that wish to make event delivery asynchronous. * * @param event event to dispatch. * @param wrapper wrapper that will call the handler. */ @Override protected void dispatch(Object event, EventHandler wrapper) { try { if (wrapper.getTarget() instanceof Activity) { Activity target = (Activity) wrapper.getTarget(); if (target.isFinishing() || target.isDestroyed()) return; try { wrapper.handleEvent(event); } catch (Throwable e) { LogUtils.LOGE("Bus", "Error dispatching event to " + target.getClass().getSimpleName(), e); } } wrapper.handleEvent(event); } catch (InvocationTargetException e) { throwRuntimeException( "Could not dispatch event: " + event.getClass() + " to handler " + wrapper, e); } } }