Разрешение 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 в расширенное приложение (это неправильно на сегодняшний день):

StrictMode

Вот проблема Google Code, которая описывает проблему и дает обходной путь:

Google Code Issue 35298

Кажется, ничего не изменилось в StrictMode начиная с API 11. Должно быть, изменения в некоторых других классах Android, которые вы использовали, вызвали нарушение политики StrictMode.

В самой документации Android написано

"Но не чувствую себя обязанным исправить все, что находит StrictMode".

Но так как его NetworkOnMainThreadException Вы должны сделать тщательную проверку. Просмотрите все сетевые коммуникации в вашем приложении и убедитесь, что они не блокируют ваш основной поток.

И убедитесь, что вы удалите / отключите StrictMode код в вашей версии сборки, так как это всего лишь инструмент разработчика для выявления случайных ошибок.

Обновить:

Ваше приложение упало, потому что:

  • Вы не блокировали выполнение кода параметра политики StrictMode в своей сборке выпуска. Это должно быть выполнено только во время тестирования.
  • Что-то изменилось в StrictMode класс, вызвавший сброс политики строгого режима после onCreate,

У меня есть 2 вопроса:

  1. Не указывает ли сбой на то, что политика StrictMode работала? Произошло нарушение политики, и, следовательно, он потерпел крах.
  2. Не означает ли это, что в вашем приложении есть какой-то сетевой код, который блокирует основной поток?
Другие вопросы по тегам