Tôi đang sử dụng Otto để làm mới danh sách bạn bè khi một người bạn bắt đầu làm phiền tôi. Tôi gặp sự cố khi cập nhật giao diện người dùng từ một chuỗi không phải chính, vì vậy tôi đã xem xét vấn đề này và giải quyết vấn đề bằng cách sử dụng số post này. Các mã họ sử dụng là:Sử dụng Otto để làm mới danh sách chương trình từ một GcmListenerService
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);
}
});
}
}
}
tôi làm bài như thế này:
final Bus bus = BusProvider.getInstance();
Log.d(LOG_TAG, "Attempting to post from LBGcmListenerService!");
bus.post(new BuddiesEvent());
Về cơ bản thực hiện một singleton Bus và đăng thông qua đó, đảm bảo rằng nó là trên chính chủ đề. Tuy nhiên, tôi không thể lấy mã đó để làm việc. Thay vào đó, tôi đã khởi tạo Trình xử lý trong lớp mà tôi đăng từ, như vậy:
final Bus bus = BusProvider.getInstance();
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
bus.post(new BuddiesEvent());
}
);
Điều này thật tuyệt vời. Nhưng tôi không muốn tạo đối tượng Handler trước mỗi bài đăng. Tôi không biết nếu đây là một vấn đề Java hoặc một vấn đề Android, nhưng tôi sẽ đánh giá cao nếu ai đó có thể giúp tôi tìm ra cách để làm cho lớp singleton xử lý vấn đề này. Cảm ơn!
cố định: Đưa mã chính xác ở đây:
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);
}
});
}
}
}
Sự cố với lớp 'AndroidBus' là gì? –
Khi tôi sử dụng lớp AndroidBus và gọi bus.post trên ví dụ Bus của tôi (phương thức getInstance không được hiển thị trong đoạn mã trên), tôi nhận được thông báo lỗi "bus 'default' được truy cập từ một chuỗi không chính null ". Khi tôi khởi tạo Trình xử lý trong lớp đăng sự kiện, giống như đoạn mã thứ hai ở trên, tất cả đều hoạt động tốt. @Gil, ** nếu bạn có thể yêu cầu lớp AndroidBus hoạt động, đăng từ một Dịch vụ chứ không phải là hoạt động, tôi muốn được quan tâm để xem cách thực hiện! ** – Brandon
Mã có vẻ tốt. Lời giải thích duy nhất mà tôi có thể đưa ra là looper looper của thread, do đó Looper.myLooper() trả về null khi Bus đăng (lớp siêu). Bạn có thể kiểm tra xem cả hai, super.post (sự kiện) hoặc AndroidBus.super.post (sự kiện) nào không? (đặt một số bản ghi ngay trước khi các cuộc gọi) –