Чтобы предотвратить 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();
}
}
}
Если вы не знаете, где искать, есть ли способ, которым Вы могли бы построить сторожевой таймер, который просто перезапускает приложение? Как этот сторожевой таймер может жить вне контекста приложения?