Можно ли избежать ANR с помощью StrictMode в Android?

Некоторые, где я читал, что с помощью StrictMode мы можем избежать ANR в Android. я попробовал вот так вот код

public class MyApplication extends Application {

@Override
public void onCreate() {


        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                .detectAll()
                .penaltyLog()
                .penaltyFlashScreen()
                .penaltyDeath()
                .detectDiskReads()
                .detectDiskWrites()
                .detectNetwork()
                .build());

    super.onCreate();
}

и я попытался сгенерировать ANR для целей тестирования, как показано ниже

 @Override
public boolean onTouchEvent(MotionEvent event) {
    Log.d("kishan","onTouchEvent");
    while(true) {}
}

Но все же ANR появляется на экране. Как избежать ANR с помощью StrictMode? Является ли это возможным?

3 ответа

Что такое ANR?

Когда поток пользовательского интерфейса приложения Android блокируется слишком долго, возникает ошибка "Приложение не отвечает" (ANR). Если приложение находится на переднем плане, Android отобразит диалоговое окно ANR для конкретного приложения, когда обнаружит одно из следующих условий:

  • Нет ответа на событие ввода (например, нажатие клавиши или события касания экрана) в течение 5 секунд.
  • BroadcastReceiver не завершил работу в течение 10 секунд.

Как избежать ANR?

Сохраняя отзывчивость основного потока вашего приложения, вы можете предотвратить отображение диалогов ANR пользователям.

  • В частности, действия должны сделать как можно меньше, чтобы настроить в ключевых методах жизненного цикла, таких как onCreate() а также onResume(),
  • Потенциально длительные операции, такие как операции с сетью или базой данных, или вычислительно дорогостоящие вычисления, такие как изменение размера растровых изображений, должны выполняться в рабочем потоке, например AsyncTask.

Диагностика ANR:

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

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

Оформить официальные документы разработчика Android, чтобы знать, как исправить проблемы ANR?

Как сказано в документации StrictMode:

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

StrictMode поможет вам определить, какая часть вашего кода выполняет какие-то чрезмерные действия, например, сеть или диск, ограничив доступ, затем предоставив вам ANR или журнал сбоев, который зависит от установленного вами штрафа. Он не удалит ваш ANR, но ограничит вас в создании кода, который приведет к ANR.

Вы можете отключить строгий режим с помощью следующего фрагмента кода

if (android.os.Build.VERSION.SDK_INT > 9) {
    StrictMode.ThreadPolicy policy = 
    new StrictMode.ThreadPolicy.Builder().permitAll().build();      
        StrictMode.setThreadPolicy(policy);
}

То, что вы делали, это включали строгий режим, вам нужно его отключить, как я понимаю ваш вопрос.

Другие вопросы по тегам