2015-07-19 13 views
5

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

    } 
} 

}

+0

Sự cố với lớp 'AndroidBus' là gì? –

+0

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

+0

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) –

Trả lời

2

Vâng, tôi figured it out. Câu trả lời ở đây không có gì bí ẩn. Trong lớp singleton của tôi, tôi đã tạo ra một đối tượng Bus và chuyển giao nó như là một cá thể. Tôi đã không làm một BusProvider. Vì vậy, khi tôi gọi là post, nó không gọi phương thức ghi đè BusProvider nhưng phương thức Bus không phải là "thread safe" trong trường hợp của tôi. Sau khi tôi thay đổi mã để phản ánh sự công nhận này, nó đã hoạt động rất tốt!

Các vấn đề liên quan