2014-07-02 5 views
6

Ho aggiornato agli ultimi strumenti Android SDK (23.0.0), Platform-tools (20.0.0), plug-in Android Studio Gradle (0.12. +) E improvvisamente sono ricevendo una strana relazione sul rilascio di Lint che diceva che dovrei usare apply() invece di commit() poiché apply() è asincrono e consentirà al thread dell'interfaccia utente di continuare come commit() lo bloccherà per la scrittura. Freddo. Ma ancora sto ottenendo questo:Lint di Android Avvertenza SharedPreferences.Editor.apply()

enter image description here

E 'un bug Lint, o mi sto perdendo qualcosa qui?

Ovviamente potrei sopprimere questo avviso, ma lo trovo inutile e ignaro della causa principale.

MODIFICA: questo verrà generato anche quando si costruisce l'app dalla riga di comando.

+0

Penso che sia un bug. Prova a dividere il "punto" a lungo espressione in diverse linee - assegnazione variabile locale, mettere una corda, mettere seconda stringa e applicare –

+0

provato, non ha funzionato. Tuttavia, se dovesse funzionare, sarebbe una soluzione alternativa per soddisfare l'avviso Lint senza alcun beneficio effettivo per la leggibilità del codice. –

risposta

5

Si tratta di un bug Lint, infatti. Più specificamente, this one.

L'errore sembra essere nella classe interna CommitFinder di SharedPrefsDetector:

@Override 
public boolean visitMethodInvocation(MethodInvocation node) { 
    ... 
    String name = node.astName().astValue(); 
    boolean isCommit = "commit".equals(name); 
    if (isCommit || "apply".equals(name)) { 
     ... 

     if (returnValueIgnored) { 
      String message = "Consider using apply() instead; commit writes " 
        + "its data to persistent storage immediately, whereas " 
        + "apply will handle it in the background"; 
      mContext.report(ISSUE, node, mContext.getLocation(node), message, 
           null); 
     } 

Credo che l'idea era di dare questo avvertimento solo se non è stato assegnato il valore di ritorno di commit() a nulla (questa parte funziona), ma si sono dimenticati di controllare la bandiera isCommit. :)