Разрешение StrictModeBuilder Все не работает
У меня есть старое приложение, которое отказывается работать на устройствах Android 4.1. Это исключение NetworkOnMainThreadException, которое появляется здесь.
Поэтому я попытался разрешить это с помощью следующих шагов - но они не работают. Я проверял это с помощью эмулятора 4.1. Что действительно нужно, чтобы обойти эту ошибку - переписывание приложения не вариант. В настоящее время я исключаю 4.1 устройства из моих приложений.
Файл класса...
public class StrictModeWrapper {
static {
try {
Class.forName("android.os.StrictMode");
} catch (Exception exception) {
throw new RuntimeException(exception);
}
}
public static void checkAvailable() {
}
@SuppressLint("NewApi")
public static void setThreadPolicy() {
StrictMode.ThreadPolicy strictModeThreadPolicy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(strictModeThreadPolicy);
}
}
... вызывается в расширенном классе Application:
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
try {
StrictModeWrapper.checkAvailable();
StrictModeWrapper.setThreadPolicy();
} catch (Throwable throwable) {
}
}
}
Расширенный класс Application зарегистрирован в Манифесте и работает.
2 ответа
StrictMode ведет себя иначе в версии Android>= 16, чем в предыдущих выпусках. Документы предлагают выполнять вызовы StrictMode в onCreate() расширенного Application, Activity и т. Д. По крайней мере onCreate() в расширенном Application теперь работает иначе и доказывает, что документы неправильные (на сегодняшний день).
Вот документ StrictMode, который описывает, как, например, добавить вызовы StrictMode в расширенное приложение (это неправильно на сегодняшний день):
Вот проблема Google Code, которая описывает проблему и дает обходной путь:
Кажется, ничего не изменилось в StrictMode
начиная с API 11. Должно быть, изменения в некоторых других классах Android, которые вы использовали, вызвали нарушение политики StrictMode.
В самой документации Android написано
"Но не чувствую себя обязанным исправить все, что находит StrictMode".
Но так как его NetworkOnMainThreadException
Вы должны сделать тщательную проверку. Просмотрите все сетевые коммуникации в вашем приложении и убедитесь, что они не блокируют ваш основной поток.
И убедитесь, что вы удалите / отключите StrictMode
код в вашей версии сборки, так как это всего лишь инструмент разработчика для выявления случайных ошибок.
Обновить:
Ваше приложение упало, потому что:
- Вы не блокировали выполнение кода параметра политики StrictMode в своей сборке выпуска. Это должно быть выполнено только во время тестирования.
- Что-то изменилось в
StrictMode
класс, вызвавший сброс политики строгого режима послеonCreate
,
У меня есть 2 вопроса:
- Не указывает ли сбой на то, что политика StrictMode работала? Произошло нарушение политики, и, следовательно, он потерпел крах.
- Не означает ли это, что в вашем приложении есть какой-то сетевой код, который блокирует основной поток?