Сторожевой таймер для Android

Чтобы предотвратить ANR на Android, вы можете реализовать Сторожевой таймер, который потребует запуска и ожидания другого потока. для сердечных сокращений. Если вы ожидаете, что ваше приложение будет иметь частоту обновления 30 кадров в секунду, следите за частотой обновления ниже 15 кадров в секунду. Это относится также к случаю, когда у вас может быть ANR в будущем.

Если вы знаете места, где пользовательский интерфейс может застрять на долгое время, вы можете создать сторожевой таймер для защиты от этого (например, пропустить текущий кадр). Если это слишком долго, почему вы делаете это в пользовательском интерфейсе? Если действие, которое вы выполняете, относится к перерисовке экрана, вы не можете сделать это где-то еще.

Здесь я сделал простой пример сторожевого таймера.

public class MainActivity extends AppCompatActivity {

int count = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Thread watchdogThread = new Thread(new Runnable() {
        long lastT = System.currentTimeMillis();
        long lastCount = 0;
        long missed = 0;

         @Override
         public void run() {
            while(true){
                 if (System.currentTimeMillis()-lastT>1500){
                     if (count == lastCount){
                         missed++;
                     }
                     lastCount = count;
                     if (missed > 3){
                        Log.e("test", "Error");
                    }
                    lastT = System.currentTimeMillis();
                 }
                 try {
                     Thread.sleep(100);
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }
             }
         }
        });
        watchdogThread.start();

        startCycleUI();

    }

private void startCycleUI() {
    //Runs on UI Thread
    long lastT = System.currentTimeMillis();
    while(true){
        if (System.currentTimeMillis()-lastT>1000){
            if (count < 10) {
                count++;
            }
            lastT = System.currentTimeMillis();
        }
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Если вы не знаете, где искать, можете ли вы создать сторожевой таймер, который просто перезапускает приложение? Как этот сторожевой таймер может жить вне контекста приложения?


person Radu Ionescu    schedule 11.02.2016    source источник


Ответы (1)


Вы можете использовать пример из "Java Source Проект "Хранилище кода"

У вас есть варианты:

  • Мониторинг памяти в конкретном процессе

  • Убейте процесс, если они не возвращаются

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

person Radu Ionescu    schedule 29.02.2016