gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:02:56 26 4
gpt4 key购买 nike

当好友取消好友时,我正在使用 Otto 刷新好友列表。我在从非主线程更新 UI 时遇到问题,所以我调查了它并使用此“解决”了这个问题 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);
}
});

}
}

我是这样发帖的:

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

本质上是制作一个单例总线并通过它发送消息,确保它在主线程上。但是,我无法使该代码正常工作。我改为在我发布的类中实例化处理程序,如下所示:

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

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

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

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);
}
});

}
}

最佳答案

是的,我想通了。这里的答案并不神秘。在我的单例类中,我创建了一个 Bus 对象并将其作为实例移交。我不是在制作 BusProvider。因此,当我调用 post 时,它不是调用 BusProvider 重写方法而是调用 Bus 方法,在我的例子中这不是“线程安全的”。在我更改代码以反射(reflect)这种认识后,效果很好!

关于android - 使用 Otto 从 GcmListenerService 刷新列表适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31502320/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com