Was ist besser: @SuppressLint oder @TargetApi?

100

Ich habe Probleme in meiner App bezüglich StrictModeund habe das Code-Snippet hinzugefügt, das das grundsätzlich deaktiviert StrictModeHelper. Lint beschwert sich jedoch setThreadPolicy()jetzt und schlägt vor, entweder hinzuzufügen

@SuppressLint 'NewApi'

oder

@TargetApi(Build.VERSION_CODES.GINGERBREAD)

zum onCreate()Ereignis der Ansicht.

Welche Methode wird bevorzugt? Oder machen sie im Grunde das Gleiche?

richey
quelle

Antworten:

176

Ich habe Probleme in meiner App in Bezug auf StrictMode und habe das Code-Snippet hinzugefügt, das den StrictModeHelper grundsätzlich deaktiviert

Bitte beheben Sie den Netzwerkfehler.

Welche Methode wird bevorzugt? Oder machen sie im Grunde das Gleiche?

@TargetApiund @SuppressLinthaben den gleichen Kerneffekt: Sie unterdrücken den Flusenfehler.

Der Unterschied besteht darin, dass @TargetApiSie über den Parameter angeben, welche API-Ebene Sie in Ihrem Code angesprochen haben, sodass der Fehler erneut auftreten kann, wenn Sie die Methode später ändern, um zu versuchen, auf etwas zu verweisen, das neuer ist als die angegebene API-Ebene @TargetApi.

Angenommen StrictMode, Sie haben versucht, das Problem der AsyncTaskSerialisierung auf neueren Android-Versionen zu umgehen, anstatt die Beschwerden über Ihren Netzwerkfehler zu blockieren . Sie haben eine solche Methode in Ihrem Code, um sich auf neueren Geräten für den Thread-Pool zu entscheiden und auf älteren Geräten das Standard-Multithread-Verhalten zu verwenden:

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

Mit @TargetApi(11)bedeutet , dass wenn Lint erkennt , dass ich etwas mit neuer als meine android:minSdkVersion, aber bis zu API Ebene 11, Lint wird nicht beschweren. In diesem Fall funktioniert das. Wenn ich diese Methode jedoch so geändert habe, dass sie auf etwas verweist, das erst auf API-Ebene 14 hinzugefügt wurde, wird der Lint-Fehler erneut @TargetApi(11)angezeigt , da in meiner Anmerkung angegeben ist, dass ich den Code nur so korrigiert habe , dass er auf API-Ebene 11 und darunter funktioniert , nicht API Level 14 und darunter .

Bei Verwendung @SuppressLint('NewApi')würde ich den Lint-Fehler für jede API-Ebene verlieren , unabhängig davon, worauf mein Code verweist und wofür mein Code eingerichtet ist.

Daher @TargetApiist dies die bevorzugte Anmerkung, da Sie den Build-Tools "OK, ich habe diese Kategorie von Problemen behoben" genauer mitteilen können.

CommonsWare
quelle
Ich bin mir bewusst, dass die Verwendung eines Async-Ansatzes vorzuziehen wäre. In meinem speziellen Fall werde ich mich an die Problemumgehung halten. Vielen Dank für diese detaillierte und sehr verständliche Erklärung - und bei dieser Gelegenheit auch für Ihre sehr hilfreichen Webseiten, die mir sehr geholfen haben, einige der Konzepte der Android-Programmierung zu verstehen! R.
Richey
9
@richey: "Nur in meinem speziellen Fall werde ich mich an die Problemumgehung halten" - das ist keine gute Idee. Mobile Geräte sind mobil. Netzwerkverbindungen sind ziemlich instabil und können unter verschiedenen Umständen (z. B. schwaches Signal) erheblich länger dauern. Wenn Sie Netzwerk-E / A für den Hauptanwendungsthread ausführen, stürzt Ihre App zufällig mit einem ANR im Feld ab.
CommonsWare
2
Wow, dein Codebeispiel ist der GENAUE Code, den ich zu schreiben versuche! Was für ein Zufall :)
Ilya Kogan
4
Wäre es nicht ordentlicher / konsistenter, @TargetApi (Build.VERSION_CODES.HONEYCOMB) zu verwenden, wenn Sie Build.VERSION_CODES.HONEYCOMB in der if-Anweisung verwenden?
Oliver Pearmain
1
"dass ich den Code nur so korrigiert habe, dass er auf API Level 11 und darunter funktioniert, nicht auf API Level 14 und darunter." - meinst du nicht "und höher"?
Arekolek