使用 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"。在我更改代码以反映此识别后,效果很好!
当好友取消好友时,我正在使用 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"。在我更改代码以反映此识别后,效果很好!