使用 Otto 从 GcmListenerService 刷新列表适配器

Using Otto to refresh a listadapter from a GcmListenerService

当好友取消好友时,我正在使用 Otto 刷新好友列表。我在从非主线程更新 UI 时遇到问题,所以我调查了它并 'solved' 使用此 post 的问题。他们使用的代码是这样的:

public class BusProvider extends Bus{

public static final String LOG_TAG = BusProvider.class.getSimpleName();

private final Handler mainThread = new Handler(Looper.getMainLooper());
private static Bus mInstance;

public static synchronized Bus getInstance() {
    if (mInstance == null) {
        mInstance = new Bus();
    }
    return mInstance;
}

@Override
public void post(final Object event) {
    if (Looper.myLooper() == Looper.getMainLooper()) {
        Log.d(LOG_TAG, "Posting event using super!");
        super.post(event);
    } else {
        mainThread.post(new Runnable() {
            @Override
            public void run() {
                Log.d(LOG_TAG, "Posting event using AndroidBus!");
                BusProvider.super.post(event);
            }
        });

    }
}

}

我把 post 做成这样:

final Bus bus = BusProvider.getInstance();
Log.d(LOG_TAG, "Attempting to post from LBGcmListenerService!");
bus.post(new BuddiesEvent());

本质上是制作单例总线并post通过它,确保它在主线程上。但是,我无法使该代码正常工作。相反,我在 class I post 中实例化了处理程序,因此:

final Bus bus = BusProvider.getInstance();
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
       @Override
        public void run() {
        bus.post(new BuddiesEvent());
        }
);

效果很好。 但我不想在每个 post 之前都创建一个 Handler 对象。我不知道这是 Java 问题还是 Android 问题,但如果有人能帮我弄清楚如何让单例 class 处理这个问题,我将不胜感激。谢谢!

已修复: 将正确的代码放在这里:

public class BusProvider extends Bus{

public static final String LOG_TAG = BusProvider.class.getSimpleName();

private final Handler mainThread = new Handler(Looper.getMainLooper());
private static BusProvider mInstance;

public static synchronized BusProvider getInstance() {
    if (mInstance == null) {
        mInstance = new BusProvider();
    }
    return mInstance;
}

@Override
public void post(final Object event) {
    if (Looper.myLooper() == Looper.getMainLooper()) {
        Log.d(LOG_TAG, "Posting event using super!");
        super.post(event);
    } else {
        mainThread.post(new Runnable() {
            @Override
            public void run() {
                Log.d(LOG_TAG, "Posting event using AndroidBus!");
                BusProvider.super.post(event);
            }
        });

    }
}

}

是的,我明白了。这里的答案并不神秘。在我的单身人士 class 中,我正在创建一个 Bus 对象并将其作为实例移交。我不是在制作 BusProvider。因此,当我调用 post 时,它不是调用 BusProvider 重写方法,而是调用 Bus 方法,在我的例子中它不是 "thread safe"。在我更改代码以反映此识别后,效果很好!