AndroidAnnotations' @UiThread实现了吗?

时间:2015-10-11 10:17:37

标签: java android annotations

AndroidAnnotations提供了一个允许在UI线程上运行方法的注释,无论从哪个线程调用它,例如。

void myMethod() {
    doInUiThread("hello", 42);
}

@UiThread
void doInUiThread(String aParam, long anotherParam) {
    [...]
}

来自AndroidAnnotations Wiki @UiThread

这个注释是如何实现的?

我知道注释生成器可以生成其他类,例如继承Runable。但是注释如何称之为自定义代码?注释可以修改方法本身或它被调用的位置吗?

1 个答案:

答案 0 :(得分:1)

我不确定Android Annotations项目,但普通的Android支持注释不会自动切换到UI线程来调用这些方法 - 它们只是编码器的指示 (以及任何代码验证器)该方法只应从UI线程调用。

换句话说,即使使用CalledFromWrongThreadException注释,此代码仍会抛出@UiThread

import android.support.annotation.UiThread;
...

public class XYZ extends Activity {

    public void onCreate(Bundle b) {
         super.onCreate();
         setContentView(R.layout.xyz);

         new Thread(new Runnable() {
               @Override
               public void run() {
                  XYZ.this.updateUI();
               }
         }).start();
    }

    @UiThread
    void updateUI() {
        ((TextView) findViewById(R.id.texty)).setText("Whoops");
    }
}

从您在问题中引用的支持注释链接中解释:

  

如果您尝试从覆盖的方法调用[@UiThread方法]   doInBackground,或者如果调用任何View方法,工具将会   现在将此标记为错误

工具会将其标记为错误,但仍可构建并运行应用程序(尽管它可能会如上所述崩溃)。