Вопрос

Я пытаюсь свести к минимуму количество мест в моем коде, где мне нужно настроить StrictMode. Но я не уверен, прав ли я или нет в следующем.

В документации для Android StrictMode говорится, что вы можете использовать его для приложений, действий и других компонентов. Я читал, что не желательно расширить класс приложений, и я бы предпочел не расширять приложение, чтобы включить StrictMode. Но я не думаю, что должен.

Есть две политики, которые вы можете использовать: Threadpolicy (для потока) и VMPolicy (для всех потоков). Таким образом, может показаться, что если я один раз настрою StrictMode на потоке, это не имеет значения, откуда я это делаю, и после этого сообщается о нарушениях в этом потоке независимо от других вызовов или нет на строгое моде. Мне просто нужно назвать это откуда -то, прежде чем могут произойти нарушения, которые я хочу обнаружить. И необходимо настроить для любых новых потоков, которые создаются в моем приложении, которые я также хочу проверить.

Я думаю, что я хочу избежать, это называть методы Build () больше, чем мне нужно. Поместить строгомумода в начале onCreate() Во всех моих действиях означает, что Build () будет вызван более одного раза в этой ветке. Если в моем приложении у меня есть одна активность запуска, настраивая строгомумода в этой деятельности onCreate() должно быть достаточно для остальной части приложения. Это правда?

Во -вторых, если моя основная деятельность перезапускается, даже если приложение не умерло, технически ли необходимо снова вызвать StrictMode? Или моя ветка все еще настроена, чтобы сообщить о нарушениях? Я думал, что может быть какая-то ценность в проведении класса обертки вокруг StrictMode, как 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...");
        }
    }
}

Таким образом, в моей основной деятельности Oncreate () я могу просто назвать mystrictmodesettings.init () и покончить с этим. И это должно работать над версиями Android до 2,3. Но это может не стоить. Брэд, ты там? Спасибо.

Редактировать: Поскольку VMPolicy предназначена для всех потоков, технически мне нужно настроить это только один раз на приложение, верно? Таким образом, EnabledEfaults () - это трата усилий, чтобы переделать VMPolicy, когда она называется вторым, третьим и т. Д.? Опять же, может быть, это больше проблем, чем стоит попытаться избежать дополнительных звонков.

Это было полезно?

Решение

Да, VMPolicy для всего процесса, поэтому делать это один раз в порядке. Однако больше раз это дешево, так что не удивляйся об этом.

И да, вам нужно только сделать это в вашей основной/запускающей деятельности Oncreate ()-это та же «основная» поток, что и все другие ваши компоненты.

Другие советы

Глядя на исходный код, вы можете видеть, что он называется статически:

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

И сама политика также хранится статически - в классе нет нестатических переменных членов.

    private static volatile VmPolicy sVmPolicy = VmPolicy.LAX;

Это означает, что вам нужно сделать это только один раз на приложение, например, в запуск/входной деятельности для вашего приложения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top