2016-02-11 5 views
0

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

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

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

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(); 
     } 
    } 
} 

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

ответ

0

Вы можете использовать пример из "Java Source Code Warehouse" project

Вы имеете возможность:

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

  • убить процесс, если они не возвращают

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