Cosa c'è di meglio: @SuppressLint o @TargetApi?


100

Ho problemi con la mia app StrictModee ho aggiunto lo snippet di codice che sostanzialmente disabilita il file StrictModeHelper. Tuttavia, Lint si lamenta setThreadPolicy()ora e propone di aggiungere

@SuppressLint 'NewApi'

o

@TargetApi(Build.VERSION_CODES.GINGERBREAD)

alla onCreate()manifestazione della vista.

Quale metodo è preferito .. o fondamentalmente stanno facendo lo stesso?

Risposte:


176

Ho problemi nella mia app per quanto riguarda StrictMode e ho aggiunto lo snippet di codice che sostanzialmente disabilita StrictModeHelper

Correggi il bug di rete.

Quale metodo è preferito .. o fondamentalmente stanno facendo lo stesso?

@TargetApie @SuppressLinthanno lo stesso effetto principale: sopprimono l'errore Lint.

La differenza è che con @TargetApi, dichiari, tramite il parametro, quale livello API hai indirizzato nel tuo codice, in modo che l'errore possa apparire di nuovo se in seguito modifichi il metodo per provare a fare riferimento a qualcosa di più nuovo del livello API citato in @TargetApi.

Ad esempio, supponi che, invece di bloccare i StrictModereclami sul tuo bug di rete, stavi cercando di aggirare il problema della AsyncTaskserializzazione sulle versioni più recenti di Android. Hai un metodo come questo nel tuo codice per attivare il pool di thread sui dispositivi più recenti e utilizzare il comportamento multithread predefinito sui dispositivi meno recenti:

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

Avere @TargetApi(11)significa che se Lint rileva che sto utilizzando qualcosa di più nuovo del mio android:minSdkVersion, ma fino al livello API 11, Lint non si lamenterà. In questo caso, funziona. Se, tuttavia, ho modificato questo metodo per fare riferimento a qualcosa che non è stato aggiunto fino al livello API 14, l'errore Lint apparirà di nuovo, perché la mia @TargetApi(11)annotazione dice che ho corretto il codice solo per funzionare su API Level 11 e inferiore , non API livello 14 e sotto sopra.

Utilizzando @SuppressLint('NewApi'), perderei l'errore Lint per qualsiasi livello API, indipendentemente da ciò che fa riferimento il mio codice e da ciò che il mio codice è impostato per gestire.

Quindi, @TargetApiè l'annotazione preferita, in quanto ti permette di dire agli strumenti di costruzione "OK, ho risolto questa categoria di problemi" in modo più dettagliato.


Sono consapevole del fatto che l'utilizzo di un approccio asincrono sarebbe preferibile, solo nel mio caso particolare mi atterrò alla soluzione alternativa. Grazie per questa spiegazione dettagliata e molto comprensibile - e con questa possibilità, grazie anche per le vostre pagine web molto utili che mi hanno aiutato molto a capire alcuni dei concetti della programmazione Android! R.
richey

9
@richey: "solo nel mio caso particolare mi atterrò alla soluzione alternativa" - questa non è una buona idea. I dispositivi mobili sono mobili. Le connessioni di rete sono piuttosto instabili e possono richiedere molto più tempo in varie circostanze (ad esempio, segnale debole). L'esecuzione di I / O di rete sul thread dell'applicazione principale significa che la tua app si arresta in modo casuale con un ANR nel campo.
CommonsWare

2
Wow, il tuo esempio di codice è il codice ESATTO che sto cercando di scrivere! Che coincidenza :)
Ilya Kogan

4
Non sarebbe più ordinato / più coerente usare @TargetApi (Build.VERSION_CODES.HONEYCOMB) dato che usi Build.VERSION_CODES.HONEYCOMB nell'istruzione if?
Oliver Pearmain

1
"che ho corretto il codice solo per funzionare con il livello API 11 e inferiore, non il livello API 14 e inferiore." - non intendi "e sopra"?
arekolek
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.