Что лучше: @SuppressLint или @TargetApi?

У меня есть проблемы в моем приложении относительно StrictMode и добавлен фрагмент кода, который в основном отключает StrictModeHelper. Тем не менее, Lint жалуется на setThreadPolicy() сейчас и предлагает либо добавить

@SuppressLint 'NewApi'

или

@TargetApi(Build.VERSION_CODES.GINGERBREAD)

к событию onCreate() представления.

Какой метод предпочтительнее.. или они в основном делают то же самое?

Ответ 1

У меня есть проблемы в моем приложении относительно 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 обнаруживает, что я использую нечто более новое, чем my android:minSdkVersion, но до уровня API 11, Lint не будет жаловаться. В этом случае это работает. Если, однако, я изменил этот метод, чтобы ссылаться на то, что не было добавлено до уровня API 14, тогда ошибка Lint появится снова, потому что моя аннотация @TargetApi(11) говорит, что я только исправил код для работы на уровне API 11 и < забастовкa > ниже, а не уровень API 14 и ниже выше.

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

Следовательно, @TargetApi является предпочтительной аннотацией, так как позволяет вам рассказать инструментам сборки "ОК, я исправил эту категорию проблем" более тонко.