Frage

Ich versuche, die Zahl der Plätze in meinem Code zu minimieren, wo ich Setup StrictMode benötigen. Aber ich bin nicht sicher, ob ich richtig oder nicht über die folgende bin.

Die Dokumentation für Android StrictMode sagt man es für Applikationen verwenden können, Aktivitäten und andere Komponenten. Ich habe gelesen, dass es nicht wünschenswert ist, die Application-Klasse zu erweitern, und ich würde es vorziehen, nicht Anwendung zu verlängern nur StrictMode zu ermöglichen. Aber ich glaube nicht, ich muss.

Es gibt zwei Richtlinien, die Sie verwenden können: ThreadPolicy (für einen Thread) und VmPolicy (für alle Threads). So scheint es, dass, wenn ich einen Setup StrictMode einmal an einem Faden, spielt es keine Rolle, von wo aus ich das tue, und Verstöße werden danach unabhängig von anderen Anrufen auf diesem Thread gemeldet werden oder nicht auf StrictMode. Ich brauche nur es von irgendwo anrufen, bevor Verletzungen auftreten könnten, dass ich erkennen soll. Und es muss Setup für neue Threads sein, die in meiner Anwendung erstellt bekommen, dass ich mag auch überprüfen.

Was ich denke, ich möchte vermeiden, ruft die Build () -Methoden mehr als ich brauche. Putting StrictMode zu Beginn des onCreate() in all meinen Aktivitäten bedeutet, dass build () wird mehr erhalten genannt als einmal auf diesem Thread. Wenn ich eine Launcher Aktivität in meiner Anwendung habe, die Einrichtung von StrictMode, dass onCreate() der Aktivität sollte für den Rest der Anwendung ausreichend sein. Ist das wahr?

Zweitens, wenn meine Haupttätigkeit neu gestartet wird, obwohl die Anwendung nicht sterben, ist es technisch notwendig StrictMode ruft wieder? Oder ist mein Thread noch Setup Bericht Verletzungen? 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 in meiner Haupttätigkeit des onCreate () kann ich einfach MyStrictModeSettings.init () aufrufen und mit ihr geschehen. Und es sollte auch vor 2.3 auf Android-Versionen arbeiten. Aber es kann nicht sein, es lohnt sich. Brad, bist du da? Danke.

Edit: Da VmPolicy für alle Threads ist, technisch Ich brauche nur, dass einzurichten einmal pro Anwendung, nicht wahr? So enableDefaults () verschwendet Aufwand die VmPolicy zu wiederholen, wenn es eine zweite, dritte, usw. Zeit aufgerufen wird? Auch hier ist es vielleicht mehr Mühe, als wert, es zu versuchen, die zusätzlichen Anrufe zu vermeiden.

War es hilfreich?

Lösung

Ja, das ist VmPolicy für den gesamten Prozess so tut es einmal in Ordnung ist. Öfter ist billig, obwohl, also nicht wory über sie.

Und ja, Sie müssen es nur in Ihrer main / Launcher onCreate Tätigkeit tun () ---, dass das gleiche „main“ Thread wie alle anderen Komponenten.

Andere Tipps

Mit Blick auf den Quellcode, 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

    private static volatile VmPolicy sVmPolicy = VmPolicy.LAX;

Das heißt, Sie brauchen nur, es zu tun einmal pro Anwendung wie bei der Einführung / Eintrag Aktivität für Ihre Anwendung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top