2011-01-16 8 views
4

Ich versuche, die Anzahl der Stellen in meinem Code zu minimieren, wo ich StrictMode einrichten muss. Aber ich bin mir nicht sicher, ob ich recht habe oder nicht.Welchen Lebenszyklus hat der StrictMode von Android?

Die Dokumentation für StrictMode von Android besagt, dass Sie es für Anwendungen, Aktivitäten und andere Komponenten verwenden können. Ich habe gelesen, dass es nicht wünschenswert ist, die Application-Klasse zu erweitern, und ich würde es vorziehen, Application nicht zu erweitern, nur um StrictMode zu aktivieren. Aber ich glaube nicht, dass ich es muss.

Es gibt zwei Richtlinien, die Sie verwenden können: ThreadPolicy (für einen Thread) und VmPolicy (für alle Threads). Wenn ich StrictMode einmal für einen Thread eingerichtet habe, spielt es keine Rolle, woher ich das tue, und Verstöße werden danach in diesem Thread gemeldet, unabhängig von anderen Aufrufen oder nicht von StrictMode. Ich muss es nur von irgendwo anrufen, bevor es zu Verstößen kommen könnte, die ich entdecken möchte. Und es muss für alle neuen Threads eingerichtet werden, die in meiner Anwendung erstellt werden, die ich auch überprüfen möchte.

Was ich denke, ich möchte vermeiden, ruft die build() -Methoden mehr als ich brauche. Setzen StrictMode am Anfang von onCreate() in allen meinen Aktivitäten bedeutet, dass build() wird mehr als einmal in diesem Thread aufgerufen werden. Wenn ich eine Launcher-Aktivität in meiner Anwendung habe, sollte das Einrichten von StrictMode in dieser Aktivität onCreate() für den Rest der Anwendung ausreichend sein. Ist das wahr?

Zweitens, wenn meine Hauptaktivität neu gestartet wird, obwohl die Anwendung nicht abstürzte, ist es technisch notwendig, StrictMode erneut aufzurufen? Oder ist mein Thread immer noch eingerichtet, um Verstöße zu melden? Ich dachte, es könnte einiger Wert dabei einen Wrapper-Typ der Klasse sein, um StrictMode etwa so:

public class MyStrictModeSettings { 
    static private List<Long> setThreads = new ArrayList<Long>(); 

    // Prevent instantiation of this class 
    private MyStrictModeSettings() {} 

    static public synchronized void init() { 
     try { 
      Long tid = Thread.currentThread().getId(); 
      if(!setThreads.contains(tid)) { 
       setThreads.add(tid); 
       Class sMode = Class.forName("android.os.StrictMode"); 
       Method enableDefaults = sMode.getMethod("enableDefaults"); 
       enableDefaults.invoke(null); 
      } 
     } 
     catch(Exception e) { 
      // StrictMode not supported on this device, punt 
      Log.v("StrictMode", "... not supported. Skipping..."); 
     } 
    } 
} 

auf diese Weise, meine Haupttätigkeit des onCreate() Ich kann einfach anrufen MyStrictModeSettings.init() und seine damit gemacht. Und es sollte auch auf Android-Versionen vor 2.3 funktionieren. Aber es lohnt sich vielleicht nicht. Brad, bist du da? Vielen Dank.

Bearbeiten: Da VmPolicy für alle Threads ist, muss ich technisch nur einmal pro Anwendung einrichten, oder? Also macht enableDefaults() Mühe, die VmPolicy zu wiederholen, wenn es eine zweite, dritte usw. Zeit aufgerufen wird? Vielleicht ist es mehr Mühe, als es sich lohnt, die zusätzlichen Anrufe zu vermeiden.

Antwort

7

Ja, VmPolicy ist für den gesamten Prozess, so dass es einmal in Ordnung ist. Mehr Zeiten sind jedoch billig, also weine nicht darüber.

Und ja, Sie müssen es nur in Ihrer Haupt/Launcher-Aktivität onCreate() --- das ist der gleiche "Haupt" -Thread wie alle Ihre anderen Komponenten.

2

auf den Quellcode suchen, können Sie sehen, dass es statisch aufgerufen wird:

public static void setVmPolicy(final VmPolicy policy) { 
    synchronized (StrictMode.class) { 
     sVmPolicy = policy; 
     sVmPolicyMask = policy.mask; 
     setCloseGuardEnabled(vmClosableObjectLeaksEnabled()); 

     Looper looper = Looper.getMainLooper(); 
     if (looper != null) { 
      MessageQueue mq = looper.mQueue; 
      if (policy.classInstanceLimit.size() == 0 || 
       (sVmPolicyMask & VM_PENALTY_MASK) == 0) { 
       mq.removeIdleHandler(sProcessIdleHandler); 
       sIsIdlerRegistered = false; 
      } else if (!sIsIdlerRegistered) { 
       mq.addIdleHandler(sProcessIdleHandler); 
       sIsIdlerRegistered = true; 
      } 
     } 
    } 
} 

Und die Politik selbst auch statisch gespeichert ist - gibt es keine nicht-statische Member-Variablen in der Klasse.

Dies bedeutet, dass Sie es nur einmal pro Anwendung ausführen müssen, z.

Verwandte Themen