2016-07-27 4 views
0

Я начинаю использовать EventBus 3.0.0.Является ли Greenrobot EventBus липким событием заказа гарантированным?

У меня 3 липкие события должны быть отправлены из услуг в деятельности:

  1. действие началось
  2. прогресс действие
  3. акция завершилась

я слушаю события на основной резьбе:

@Subscribe(sticky = true, threadMode = ThreadMode.MAIN) 
public void on...Event(... event) { 
... 
} 

Служба отправляет события по порядку: started-progressN-..-progressM-finished, а подписанная активность обновляет пользовательский интерфейс в соответствии с событиями.

После того, как действие повернуто, я ожидаю получить липкие события в том порядке, в котором они были отправлены, так как иначе он разрывает ui (так как при запуске устанавливается прогресс 0). Является ли порядок событий гарантированным EventBus (предполагая, что я использую тот же EventBus, тот же поток приемника, тот же самый подписчик для всех этих событий)?

В соответствии с моими испытаниями не гарантируется, и это особенность/проблема, не так ли?

перед тем вращения:

07-27 11:27:55.254 27910-27910/ app D/App﹕ status Compilation started ... 
07-27 11:27:55.254 27910-27910/ app D/App﹕ compile progress 0% 
07-27 11:27:55.354 27910-27910/ app D/App﹕ compile progress 20% 
07-27 11:27:55.354 27910-27910/ app D/App﹕ compile progress 30% 
07-27 11:27:55.354 27910-27910/ app D/App﹕ compile progress 40% 
07-27 11:27:55.844 27910-27910/ app D/App﹕ compile progress 50% 

после поворота (липкие события возмущаться):

07-27 11:27:59.554 27910-27910/ app D/App﹕ compile progress 50% 
07-27 11:27:59.554 27910-27910/ app D/App﹕ status Compilation started ... 
+1

И ваши события 'status' отличаются от ваших событий' progress', правильно? –

+0

они разные классы – 4ntoine

ответ

2

Я не пробовал, но документация here говорит, что вы можете указать приоритет для каждого OnEvent метода.

Угадайте, что у вас есть 3 класса событий, такие как CompilationStart, CompilationProgress и CompilationFinish, вы можете обеспечить приоритет 1, 2 и 3 соответственно, как показано ниже. В любом случае, помните, что приоритет по умолчанию является 0, поэтому любое другое событие будет получено до всех этих единиц:

@Subscribe(priority = 1); 
public void onEvent(CompilationStart event) { 
    ... 
} 
@Subscribe(priority = 2); 
public void onEvent(CompilationProgress event) { 
    ... 
} 
@Subscribe(priority = 3); 
public void onEvent(CompilationFinish event) { 
    ... 
} 

С другой стороны, вы можете не использовать приоритет, если вы просто использовать один класс таких как CompilationInfo быть это как следующим образом:

public class CompilationInfo { 
    public CompilationState compilationState; 
    public int priority 

    public CompilationInfo(CompilationState compilationState, int priority) { 
     this.compilationState = compilationState; 
     this.priority = priority; 
    } 
} 

Где CompilationState является родительским классом, CompilationStart, CompilationProgress и CompilationFinish hinerits с. Было бы даже лучше, если вы используете перечисление для поля приоритета, поскольку оно более читаемо. Таким образом вам нужен только один метод onEvent.

+0

похоже, что мне нужно, чтобы проверить и подтвердить, что – 4ntoine

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