2015-07-19 4 views
5

Я использую Отто, чтобы обновить список друзей, когда собеседник дебютирует меня. У меня проблемы с обновлением пользовательского интерфейса из основного потока, поэтому я просмотрел его и «решил» проблему, используя этот post. Код они используют это:Использование Отто для обновления listadapter из 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); 
      } 
     }); 

    } 
} 

}

Я делаю пост так:

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

По сути, делая синглтона шины и проводки через это, убедившись, что он находится на главной нить. Однако я не могу заставить этот код работать. Вместо этого я создавал экземпляр обработчика в классе I, из которого:

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, но я был бы признателен, если бы кто-нибудь мог помочь мне разобраться, как заставить класс singleton справиться с этой проблемой. Благодаря!

Исправлено: Ввод правильного кода здесь:

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

В чем проблема с классом 'AndroidBus'? –

+0

Когда я использую класс AndroidBus и вызываю bus.post в моем экземпляре Bus (метод getInstance не показан в приведенном выше коде), я получаю сообщение об ошибке, что «шина по умолчанию» была получена из не основного потока null ». Когда я создаю экземпляр обработчика в классе, который помещает событие, как и второй бит кода выше, все работает отлично. @Gil, ** если вы можете заставить класс AndroidBus работать, отправляя его из службы, а не из-за активности, мне было бы интересно посмотреть, как это делается ** ** – Brandon

+0

Код выглядит хорошо. Единственное возможное объяснение, которое я могу придумать, - это цикл петлителя потока, поэтому Looper.myLooper() возвращает значение null при публикации Bus (суперкласс). Можете ли вы проверить, какой из этих двух, super.post (event) или AndroidBus.super.post (event), не удается? (поместите несколько журналов непосредственно перед вызовами) –

ответ

2

Да, я понял. Ответ здесь не был таинственным. В моем классе singleton я создавал объект Bus и передавал его как экземпляр. Я не делал BusProvider. Поэтому, когда я вызывал сообщение, он не вызывал переопределенный метод BusProvider, а метод Bus, который не был «потокобезопасным» в моем случае. После того, как я изменил код, чтобы отразить это признание, он отлично поработал!

Смежные вопросы