2017-02-16 19 views
1

Я не новичок в использовании автобуса событий, но я получил странное поведение в следующем сценарии:Отто автобус событие не уволили из деятельности на другой вид деятельности с фрагментами

У меня есть MainActivity, которые имеют два фрагмента, которые необходимо обновить их содержимое с использованием Otto автобуса событий из SecondActivity, который запускался из MainActivity. Проблема в том, что при запуске SecondActivity MainActivity приостанавливается, и, таким образом, шина будет незарегистрирована внутри своего метода , и когда EventBus уволил свое событие из SecondActivity, он не будет принят двумя фрагментами в MainActivity.

Btw, MainActivity имеет абонентский метод для получения обновления из потока AsyncTask, и в результате он должен регистрировать и отменять регистрацию шины событий.

Вот мой BusProvider класс код:

public class BusProvider { 

    private static final Bus BUS = new Bus(ThreadEnforcer.ANY); 

    public static Bus getInstance() { 
     return BUS; 
    } 

    private BusProvider() { 
    } 
} 

Вот мой код события автобус MainActivity:

@Override 
protected void onResume() { 
    super.onResume(); 
    bus.register(this); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    bus.unregister(this); 
} 

@Subscribe 
public void onAsyncResult(SomeEvent event) { 
    // do something 
} 

Вот мой Fragmenta и FragmentB код шины событие:

@Override 
protected void onResume() { 
    super.onResume(); 
    bus.register(this); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    bus.unregister(this); 
} 

@Subscribe 
public void onValueUpdate(UpdateEvent event) { 
    mTvValue.setText(event.value); 
} 

Теперь этот код внутри SecondActivity, который мне нужно обновить от него:

BusProvider.getInstance().post(new UpdateEvent("Value Updated!")); 

Что происходит в том, что UpdateEvent пожары от SecondActivity, но не получил от двух фрагментов А и В.

ценится любой ответ полезным.

ответ

4

Как вы правильно отметили:

Проблема заключается в том, когда SecondActivity запущен, MainActivity сделал паузу и, таким образом, автобус будет незарегистрированными внутри своего метода OnPause

методы OnPause ваших фрагментов являются выполняется после запуска SecondActivity, заставляя их отменить регистрацию из шины событий. Таким образом, вы должны двигаться регистрации и отмены регистрации в OnCreate и OnDestroy соответственно

Fragmenta и FragmentB код события автобус должен быть:

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    bus.register(this); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    bus.unregister(this); 
} 
+0

Его решена, я ценю вашу помощь. – blueware