2017-06-19 8 views
9

Chcę powiadomić dewelopera, że ​​metoda jest wymagane w głównym wątku więc napisałem do następującego kodu:Korzystanie adnotacja wątek nie są sprawdzane zgodnie z oczekiwaniami

@MainThread 
    public void showToast(@NonNull String text) { 
     Toast.makeText(this, text, Toast.LENGTH_LONG).show(); 
    } 

niż ja napisał:

new Thread(new Runnable() { 
     @Override 
     public void run() { 
      showToast(""); 
     } 
    }).start(); 

i kompilator nie oznaczający tego błędu w przeciwieństwie do @StringRes i innych adnotacji, których użyłem.

Jakiś pomysł, dlaczego?

Odpowiedz

7

Supply własne adnotacje dla gwintu wnioskowania

inspekcji szarpie (o wdzięcznej nazwie „WrongThread”) nie można wywnioskować wątek, który jest wywołanie metody showToast chyba podać adnotacje, które oznaczyć metodę jako jedną z @WorkerThread etc .

Weź swój oryginalny kod i dodać @WorkerThread adnotacji metody run:

new Thread(new Runnable() { 
    @Override 
    @WorkerThread 
    public void run() { 
     showToast(""); 
    } 
}).start(); 

i będzie poprawnie generować ostrzeżenia inspekcji niestrzępiącą jak poniżej:

lint inspection warning

Szczególny przypadek AsyncTask

AsyncTask ma swoje metody oznaczone odpowiednich adnotacji wątek (link to source):

@WorkerThread 
protected abstract Result doInBackground(Params... params); 

otrzymasz ostrzeżenie za darmo, jeśli się zdarzysz użycie AsyncTask jak w poniższym przykładzie:

new AsyncTask<String, String, String>() { 
    @Override 
    protected String doInBackground(String... strings) { 
     showToast(""); //warning here: method showToast must be called from the main thread 
         //currently inferred thread is worker 
     return ""; 
    } 

Dla innych async wzorów trzeba będzie dodać własne @WorkerThread lub inne adnotacje.

Pełną listę różnych wątków jest here:

@MainThread 
@UiThread 
@WorkerThread 
@BinderThread 
@AnyThread 
Powiązane problemy