2015-10-11 56 views
2

AndroidAnnotations提供了一個註釋,它允許在UI線程上運行一個方法,而不管它從哪個線程被調用,例如,AndroidAnnotations的@UiThread如何實現?

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

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

from AndroidAnnotations Wiki @UiThread

該註釋是如何實現的?

我知道註釋生成器可以生成其他類,例如,繼承Runable。但是,註釋如何稱其爲自定義代碼?註釋是否可以修改方法本身或其調用的地方?

+0

你看過源代碼嗎? – 323go

+0

@ 323go是的,但是我發現的所有內容太抽象,無法找到隱藏技巧的地方。 –

+0

其中問題在於你的問題:如果源代碼太抽象,並且現成的註釋文檔沒有幫助,那麼我們在這裏插入幾段的內容就不太可能作爲答案。 – 323go

回答

1

我不知道關於Android的註解項目,但正常的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"); 
    } 
} 

從支持註解複述鏈接,您的問題引用:

如果您嘗試從重寫 doInBackground的方法調用[aiUThread方法],或者如果調用任何View方法,工具將 現在將此標記爲錯誤

工具會將其標記爲錯誤,但應用程序仍可以構建並運行(儘管它可能會像上面那樣崩潰)。

+0

哦,是的,你是對的。感謝您指出了這一點!這可能導致一些真正難以調試的錯誤,因爲AndroidAnnotation的'@ UiThread'完全不同:*沒有更多的AsyncTask <參數,進度,結果> !! * https://github.com/excilys/androidannotations/wiki/WorkingWithThreads# uithread –

+0

我一直認爲我應該遵循單詞的實際含義來試圖確定任何程序句子的含義。例如,'annotations'讓人們注意,另一方面'directives'是編譯器要遵循的,對嗎? – nekavally

+0

@Valentin單詞的意義通常是不夠的,當沒有上下文提供和單詞不是過度自我解釋。 「註釋」是一個在Java中具有特定含義的通用術語。其中一部分就是可以根據註釋生成Java代碼的註釋處理器的存在。據我所知,在Java中不存在指令(如果您正在討論預處理器指令) –