web-dev-qa-db-fra.com

Quoi de mieux: @SuppressLint ou @TargetApi?

J'ai des problèmes dans mon application concernant StrictMode et j'ai ajouté l'extrait de code qui désactive fondamentalement le StrictModeHelper. Cependant, Lint se plaint maintenant de setThreadPolicy() et propose soit d’ajouter

@SuppressLint 'NewApi'

ou

@TargetApi(Build.VERSION_CODES.Gingerbread)

à l'événement onCreate() de la vue.

Quelle méthode est préférable… ou est-ce qu'ils font la même chose?

100
richey

J'ai des problèmes dans mon application concernant StrictMode et j'ai ajouté l'extrait de code qui désactive fondamentalement StrictModeHelper.

Veuillez corriger le bogue de réseau.

Quelle méthode est préférable… ou font-ils fondamentalement la même chose?

@TargetApi Et @SuppressLint Ont le même effet principal: ils suppriment l'erreur Lint.

La différence est qu'avec @TargetApi, Vous déclarez, via le paramètre, le niveau d'API que vous avez défini dans votre code, afin que l'erreur puisse réapparaître si vous modifiez ultérieurement la méthode pour essayer de référencer quelque chose de plus récent que le paramètre. Niveau d'API cité dans @TargetApi.

Par exemple, supposons qu'au lieu de bloquer les plaintes StrictMode concernant votre bogue réseau, vous tentiez de contourner le problème de AsyncTask en cours de sérialisation sur les versions plus récentes d'Android. Vous avez une méthode comme celle-ci dans votre code pour entrer dans le pool de threads sur les nouveaux périphériques et utiliser le comportement multithread par défaut sur les anciens périphériques:

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

Avoir @TargetApi(11) signifie que si Lint détecte que j'utilise quelque chose de plus récent que mon Android:minSdkVersion, Mais jusqu'au niveau 11 de l'API, Lint ne se plaindra pas. Dans ce cas, ça marche. Si, toutefois, j'ai modifié cette méthode pour référencer quelque chose qui n'a pas été ajouté jusqu'au niveau 14 de l'API, l'erreur Lint réapparaîtrait, car mon annotation @TargetApi(11) indique que je ne corrige que le code pour fonctionner sur l'API. Niveau 11 et au dessous de ci-dessus, pas API Niveau 14 et au dessous de au dessus de.

En utilisant @SuppressLint('NewApi'), je perdrais l'erreur Lint pour le niveau d'API tout type, quels que soient les références de mon code et la configuration de mon code.

Par conséquent, @TargetApi Est l'annotation préférée, car elle vous permet de dire aux outils de construction "OK, j'ai corrigé cette catégorie de problèmes" d'une manière plus fine.

176
CommonsWare