2013-03-14 7 views
2
@UiThread 
void foo() { 
    ...some animations... 
}; 

@UiThread 
void bar() { 
    xyz(); 
}; 

@UiThread 
void xyz() { 
    foo(); 
}; 

Могу ли я попасть в проблему, если я использую многие из этих вложенных методов @UiThread в своем приложении?Android Аннотации @UiThread условия гонки?

Могу ли я получить некоторые условия гонки из-за этого?

Будет ли это влиять только на производительность?

ответ

2

@UIThread будет генерироваться метод, который использует Handler для выполнения кода, как это:

private Handler handler_ = new Handler(); 
public void bar() { 
    handler_.post(new Runnable() { 
     ... 
    } 
} 

Если присмотреться к Handler's javadoc, мы можем увидеть этот пункт:

Обработчик позволяет отправлять и обрабатывать объекты Message и Runnable, связанные с MessageQueue потока. Каждый экземпляр Handler связан с одним потоком и очередью сообщений этого потока. Когда вы создаете нового обработчика, он привязан к очереди потоков/сообщений потока, который его создает - с этой точки он будет доставлять сообщения и исполняемые файлы в очередь сообщений и выполнять их по мере их выхода из сообщения очередь.

Обработчик создается во время создания экземпляра класса, поэтому он будет связан с основной нитью. И поскольку каждый вызов аннотированного метода @UIThread будет привязан к этому обработчику, каждый метод будет выполняться один за другим.

Поэтому у вас не должно быть условий гонки в этих методах. И поскольку эти методы будут выполняться в основном потоке, вы должны выполнять только обработку пользовательского интерфейса.

Надеюсь, я отвечу на все ваши вопросы.

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