Що краще: @SuppressLint або @TargetApi?


100

У моїй програмі є проблеми щодо StrictModeта додали фрагмент коду, який в основному вимикає StrictModeHelper. Однак Линт setThreadPolicy()зараз скаржиться і пропонує або додати

@SuppressLint 'NewApi'

або

@TargetApi(Build.VERSION_CODES.GINGERBREAD)

до onCreate()події перегляду.

Який метод є кращим .. або вони в основному роблять те саме?

Відповіді:


176

У моєму додатку є проблеми щодо StrictMode, і я додав фрагмент коду, який в основному вимикає StrictModeHelper

Виправте помилку в мережі.

Який метод є кращим .. або вони в основному роблять те саме?

@TargetApiі @SuppressLintмають той же основний ефект: вони пригнічують помилку Lint.

Різниця полягає в тому @TargetApi, що за допомогою параметра ви оголошуєте за допомогою параметра, на якому рівні API ви зверталися у своєму коді, щоб помилка могла з’явитися знову, якщо пізніше ви модифікуєте метод, щоб спробувати посилатися на щось нове, ніж вказаний рівень API @TargetApi.

Наприклад, припустимо, що замість того, щоб блокувати StrictModeскарги на вашу помилку в мережі, ви намагалися вирішити проблему AsyncTaskсеріалізації на новіших версіях Android. У вашому коді є такий спосіб, як увімкнути пул потоків на нових пристроях та використовувати багатопоточну поведінку за замовчуванням на старих пристроях:

  @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);
    }
  }

Маючи на @TargetApi(11)увазі, що якщо Lint виявить, що я використовую щось новеше, ніж моє android:minSdkVersion, але до рівня 11 API, Lint не скаржиться. У цьому випадку це працює. Якщо я змінив цей метод на посилання на те, що не було додано до рівня 14 API, тоді помилка Lint з’явиться знову, оскільки моя @TargetApi(11)анотація говорить про те, що я лише виправив код для роботи на рівні API 11 і нижче , а не вище API Level 14 і нижче вище.

Використовуючи @SuppressLint('NewApi'), я втратив би помилку Lint для будь-якого рівня API, незалежно від того, які мої посилання на код та який мій код налаштовано для обробки.

Отже, @TargetApiє кращою анотацією, оскільки вона дозволяє розповісти інструменти збірки "ОК, я виправив цю категорію проблем" більш тонко.


Я усвідомлюю, що використання підходу Async було б кращим, лише в моєму конкретному випадку я дотримуюся обходу. Дякую за це детальне і дуже зрозуміле пояснення - і за цей шанс, дякую також за дуже корисні веб-сторінки, які мені дуже допомогли зрозуміти деякі концепції програмування Android! Р.
Річі

9
@richey: "тільки в моєму конкретному випадку я буду дотримуватися рішення" - це не дуже гарна ідея. Мобільні пристрої мобільні. Мережеві з'єднання досить нестабільні і можуть зайняти значно більше часу за різних обставин (наприклад, слабкий сигнал). Виконання мережевого вводу-виводу на основній нитці програми означає, що ваш додаток випадково вийде з ладу з ANR у полі.
CommonsWare

2
Нічого собі, прикладом вашого коду є ТОЧНИЙ код, який я намагаюся написати! Який збіг :)
Ілля Коган

4
Чи не було б акуратніше / послідовніше використовувати @TargetApi (Build.VERSION_CODES.HONEYCOMB), якщо ви використовуєте Build.VERSION_CODES.HONEYCOMB в операторі if?
Олівер Пірмен

1
"що я зафіксував код лише для роботи на рівні 11 і нижче, а не на рівні API 14 і нижче." - ви не маєте на увазі "і вище"?
arekolek
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.