2014-07-02 12 views
6

Mam zaktualizowane do najnowszej wersji narzędzia Android SDK Tools (23.0.0), Platform-tools (20.0.0), wtyczki Android Studio Gradle (0.12. +) I nagle jestem Odbieranie dziwnego raportu o błędach Lint, mówiącego, że powinienem użyć apply() zamiast commit(), ponieważ apply() jest asynchroniczne i pozwoli wątkowi UI kontynuować, ponieważ commit() będzie blokował go do pisania. Chłodny. Ale nadal jestem coraz to:Android lint SharedPreferences.Editor.apply() ostrzeżenie

enter image description here

Czy to jest bug Lint, albo ja czegoś tu brakuje?

Oczywiście mogłem powstrzymać to ostrzeżenie, ale uważam, że bezcelowe i nieświadome przyczyny.

EDYCJA: Zostanie również podniesiona podczas budowania aplikacji z wiersza poleceń.

+0

Myślę, że to błąd. Spróbuj podzielić długie wyrażenie "kropka" w kilku liniach - przypisanie zmiennej lokalnej, wstaw jeden ciąg, wstaw drugi ciąg i zastosuj –

+0

Próbowałem, że nie działało. Mimo to, gdyby to działało, byłoby to obejściem, by spełnić ostrzeżenie Linta bez rzeczywistej korzyści dla czytelności kodu. –

Odpowiedz

5

To rzeczywiście błąd Linta. Dokładniej, this one.

Błąd wydaje się być w CommitFinder wewnętrznej klasy 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); 
     } 

Chyba chodziło o to, aby dać to ostrzeżenie tylko jeśli nie przypisać wartość zwracaną commit() do niczego (ta część działa), ale zapomnieli sprawdzić flagę isCommit. :)

Powiązane problemy