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