2013-11-12 2 views
0

Я борюсь с «синхронизацией» двух слушателей для двух объектов, которые зависят друг от друга.Android. Синхронизация слушателей для зависимых объектов

Предположим, у нас есть ListView list и прокручиваемый LinearLayout slider. Оба находятся в макете в пределах Fragment.

Когда я прокручиваю список до какого-либо элемента, ползунок должен autoscroll, чтобы показать соответствующую позицию. Когда я прокручиваю ползунок, тогда список должен быть smoothScrollToPosition и показать соответствующую позицию.

Таким образом, у меня

interface SliderListener { 
    public onPositionChanged(); 
} 

и

interface ListViewListener { 
    public onListPositionChanged(); 
} 

Если я просто реализовать эти два метода в общем контроллере (я реализовать их в контроллере Fragment), то будет тупиковым (они бесконечно пытаются прокручивать друг друга и генерировать все больше и больше событий).

Я попытался использовать некоторую простую переменную буфера семафора и проверить ее состояние перед выполнением действий, но это все равно приводит к параллелизму.

Что такое правильный способ синхронизации использования слушателей?

ответ

1

Вы сделали создавать рекурсивные логические петли для событий:

A re-positioned --> scroll B= r-epositioning B --> scroll A (re-postioned) --> ..... 

Поскольку ваш Listeners все пассивных ответных действий для событий (в результате функции), вы не можете контролировать эти результирующие действия не производить события.

Вы должны изменить булеву переменную семафора значения в вашем перехватывающем случае функции обработке (как onTouch() или onScoll() или что-то в этом роде)

+0

'synchronized' для предотвращения работы от перехвата во время выполнения в случае работы с несколько потоков. –

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