Какой жизненный цикл для Android StrictMode?
-
11-10-2019 - |
Вопрос
Я пытаюсь свести к минимуму количество мест в моем коде, где мне нужно настроить 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;
Это означает, что вам нужно сделать это только один раз на приложение, например, в запуск/входной деятельности для вашего приложения.