Mam problemy w mojej aplikacji dotyczące StrictMode i dodałem fragment kodu, który zasadniczo wyłącza StrictModeHelper
Napraw błąd sieci.
Która metoda jest preferowana ... czy w zasadzie robią to samo?
@TargetApi
i @SuppressLint
mają ten sam podstawowy efekt: tłumią błąd Lint.
Różnica polega na tym @TargetApi
, że deklarujesz za pomocą parametru poziom interfejsu API, do którego adresujesz swój kod, dzięki czemu błąd może pojawić się ponownie, jeśli później zmodyfikujesz metodę, aby spróbować odwołać się do czegoś nowszego niż cytowany poziom API @TargetApi
.
Załóżmy na przykład, że zamiast blokować StrictMode
skargi dotyczące błędu sieciowego, próbujesz obejść problem AsyncTask
serializacji w nowszych wersjach Androida. W swoim kodzie masz metodę taką jak ta, która umożliwia włączenie puli wątków na nowszych urządzeniach i użycie domyślnego zachowania wielowątkowego na starszych urządzeniach:
@TargetApi(11)
static public <T> void executeAsyncTask(AsyncTask<T, ?, ?> task,
T... params) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
}
else {
task.execute(params);
}
}
Mając @TargetApi(11)
oznacza, że jeśli Lint wykryje, że używam czegoś nowszego niż mój android:minSdkVersion
, ale do API Level 11, Lint nie będzie narzekać. W tym przypadku to działa. Jeśli jednak zmodyfikowałem tę metodę, aby odwołać się do czegoś, co nie zostało dodane do poziomu API 14, to błąd Lint pojawi się ponownie, ponieważ moja @TargetApi(11)
adnotacja mówi, że naprawiłem kod do pracy tylko na poziomie API 11 i niższym powyżej, a nie Poziom API 14 i niższy powyżej.
Używając @SuppressLint('NewApi')
, straciłbym błąd Lint dla dowolnego poziomu interfejsu API, niezależnie od tego, do czego odwołuje się mój kod i do czego mój kod jest skonfigurowany.
Dlatego @TargetApi
jest to preferowana adnotacja, ponieważ pozwala powiedzieć narzędziom do budowania „OK, rozwiązałem tę kategorię problemów” w bardziej szczegółowy sposób.