2
@UiThread
void foo() {
   ...some animations...
};

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

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

如果我在我的应用程序中使用许多这些嵌套的@UiThread 方法,我会遇到麻烦吗?

我可以因此获得一些比赛条件吗?

它只会影响性能吗?

4

1 回答 1

2

@UIThread将生成一个使用 aHandler执行代码的方法,如下所示:

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

如果我们仔细查看Handler 的 javadoc,我们可以看到这一段:

Handler 允许您发送和处理与线程的 MessageQueue 关联的 Message 和 Runnable 对象。每个 Handler 实例都与单个线程和该线程的消息队列相关联。当您创建一个新的处理程序时,它会绑定到创建它的线程的线程/消息队列——从那时起,它会将消息和可运行对象传递到该消息队列并在它们从消息中出来时执行它们队列。

处理程序是在类实例化时创建的,因此它将链接到主线程。并且由于对带注释的方法的每次调用@UIThread都将排入此处理程序的队列,因此每个方法将一个接一个地执行。

所以你不应该在这些方法中有任何竞争条件。由于这些方法将在主线程上执行,因此您必须只进行 UI 处理。

我希望我能回答你所有的问题。

于 2013-03-14T09:56:24.667 回答