Mantieni tutto organizzato con le raccolte
Salva e classifica i contenuti in base alle tue preferenze.
Figura 1. Una finestra di dialogo ANR mostrata all'utente.
Questo documento descrive come il sistema Android determina se un'app non risponde e mostra come mantenere reattiva la tua app.
Indipendentemente da quanto sia scritto bene il tuo codice, l'app potrebbe risultare ancora lenta, bloccarsi, bloccarsi per periodi significativi o richiedere troppo tempo per elaborare l'input. Se la tua app è in primo piano e non risponde, l'utente visualizza una finestra di dialogo L'applicazione non risponde (ANR), come mostrato nella figura 1. La finestra di dialogo ANR consente all'utente di forzare l'uscita dall'app. Se l'app non è in primo piano, significa che viene interrotta in modalità silenziosa. È fondamentale progettare la reattività nella tua app
per ridurre al minimo le finestre di dialogo ANR.
Trigger ANR
In genere, il sistema visualizza un errore ANR se un'app non può rispondere all'input utente nel thread principale (noto anche come thread UI), impedendo al sistema di elaborare gli eventi di input utente in entrata.
Ad esempio, può verificarsi un errore ANR se un'app esegue un'operazione di I/O di blocco, come l'accesso alla rete, nel thread dell'interfaccia utente. Un altro esempio è quando un'app dedica troppo tempo alla creazione di una struttura in memoria elaborata o al calcolo della prossima mossa di un gioco nel thread dell'interfaccia utente.
In Android, la reattività delle app è monitorata dai servizi di sistema ActivityManager e WindowManager. Android mostra la finestra di dialogo ANR per un'app quando rileva una delle seguenti condizioni:
Nessuna risposta a un evento di input, ad esempio eventi di pressione di un tasto o tocco dello schermo, entro 5 secondi.
Di seguito sono riportati suggerimenti generali per evitare gli errori ANR. Per maggiori dettagli sulla diagnosi e sul debug di diversi tipi di ANR, consulta le altre pagine di questa sezione.
Mantieni sempre sbloccato il thread principale e utilizza i thread in modo strategico.
Non eseguire operazioni di blocco o a lunga esecuzione sul thread principale dell'app.
Crea invece un thread di lavoro dove svolgi la maggior parte del lavoro.
Prova a ridurre al minimo qualsiasi contesa dei blocchi tra il thread principale e altri thread.
Riduci al minimo il lavoro non correlato all'UI sul thread principale, ad esempio durante la gestione delle trasmissioni o dei servizi in esecuzione. Qualsiasi metodo eseguito nel thread dell'interfaccia utente
deve fare il meno lavoro possibile su quel thread. In particolare, la configurazione delle attività deve essere il meno possibile in metodi chiave del ciclo di vita, come onCreate() e onResume(). Consulta la panoramica del lavoro in background per ulteriori informazioni sulle soluzioni disponibili per pianificare il lavoro su un thread in background e comunicare con l'interfaccia utente.
Fai attenzione quando condividi pool di thread tra i componenti. Non utilizzare gli stessi thread per operazioni potenzialmente lunghe che bloccano operazioni e attività sensibili al tempo, come la ricezione di trasmissioni.
Mantieni rapido l'avvio dell'app. Riduci al minimo le operazioni lente o di blocco nel codice di avvio dell'app, ad esempio i metodi eseguiti durante l'inizializzazione del dagger.
Se utilizzi BroadcastReceiver, valuta la possibilità di eseguire ricevitori di trasmissioni in un
thread non principale utilizzando Context.registerReceiver. Per ulteriori informazioni, consulta la pagina ANR in BroadcastRicevir.
I tempi di esecuzione di BroadcastReceiver sono limitati perché i ricevitori di trasmissione sono concepiti per svolgere piccole quantità di lavoro discrete in background, come il salvataggio di un'impostazione o la registrazione di un Notification. Pertanto, come con altri metodi chiamati nel thread dell'interfaccia utente, le app devono evitare operazioni o calcoli potenzialmente a lunga esecuzione in un ricevitore broadcast. Invece di eseguire attività a lunga esecuzione tramite il thread dell'interfaccia utente, eseguile in background per un'esecuzione successiva. Vedi Panoramica del lavoro in background per ulteriori informazioni sulle possibili soluzioni.
Un altro problema comune con gli oggetti BroadcastReceiver si verifica quando vengono eseguiti troppo spesso. Un'esecuzione frequente in background può ridurre la quantità di memoria disponibile per altre app. Per ulteriori informazioni su come abilitare e disabilitare gli oggetti BroadcastReceiver in modo efficiente, consulta Panoramica dei trasmissioni.
Aumenta la reattività
In genere, da 100 a 200 ms è la soglia oltre la quale gli utenti percepiscono la lentezza di un'app. Di seguito sono riportati ulteriori suggerimenti per rendere la tua app reattiva per gli utenti:
Se la tua app esegue operazioni in background in risposta all'input utente, mostra che è in corso l'avanzamento, ad esempio con ProgressBar nella UI.
Per i giochi in particolare, esegui calcoli per le mosse in un thread di lavoro.
Se la fase di configurazione iniziale dell'app richiede molto tempo, potresti mostrare una schermata iniziale o eseguire il rendering della visualizzazione principale il più rapidamente possibile.
Indica che il caricamento è in corso e inserisci le informazioni in modo asincrono.
In entrambi i casi, consigliamo di indicare in qualche modo l'avanzamento, in modo che l'utente non percepisca che l'app è bloccata.
Utilizza strumenti per le prestazioni come Perfetto e CPU Profiler per
determinare i colli di bottiglia nella reattività della tua app.
I campioni di contenuti e codice in questa pagina sono soggetti alle licenze descritte nella Licenza per i contenuti. Java e OpenJDK sono marchi o marchi registrati di Oracle e/o delle sue società consociate.
Ultimo aggiornamento 2025-07-27 UTC.
[[["Facile da capire","easyToUnderstand","thumb-up"],["Il problema è stato risolto","solvedMyProblem","thumb-up"],["Altra","otherUp","thumb-up"]],[["Mancano le informazioni di cui ho bisogno","missingTheInformationINeed","thumb-down"],["Troppo complicato/troppi passaggi","tooComplicatedTooManySteps","thumb-down"],["Obsoleti","outOfDate","thumb-down"],["Problema di traduzione","translationIssue","thumb-down"],["Problema relativo a esempi/codice","samplesCodeIssue","thumb-down"],["Altra","otherDown","thumb-down"]],["Ultimo aggiornamento 2025-07-27 UTC."],[],[],null,["# Keep your app responsive\n\n**Figure 1.** An ANR dialog displayed to the user.\n\nThis document describes how the Android system determines whether an app isn't\nresponding and shows how to keep your app responsive.\n\nNo matter how well-written your code is, it's possible for your app to still\nfeel sluggish, hang, freeze for significant periods, or take too long to process\ninput. If your app is in the foreground and is unresponsive, the user gets an\nApplication Not Responding (ANR) dialog, as shown in figure 1. The ANR dialog\nlets the user force quit the app. If the app isn't in the foreground, then it's\nsilently stopped. It's critical to design responsiveness into your app to\nminimize ANR dialogs.\n\nANR triggers\n------------\n\nGenerally, the system displays an ANR if an app can't respond to user input on\nthe main thread---also known as the UI thread---preventing the system from\nprocessing incoming user input events.\n\nFor example, an ANR can occur if an app performs a blocking I/O operation, such\nas network access, on the UI thread. Another example is when an app spends too\nmuch time building an elaborate in-memory structure or computing the next move\nin a game on the UI thread.\n\nIn Android, app responsiveness is monitored by the [`ActivityManager`](/reference/android/app/ActivityManager) and\n[`WindowManager`](/reference/android/view/WindowManager) system services. Android displays the ANR dialog for an app\nwhen it detects one of the following conditions:\n\n- No response to an input event---such as key press or screen tap events---within 5 seconds.\n- A [`BroadcastReceiver`](/reference/android/content/BroadcastReceiver) doesn't finish executing within 10 to 20 seconds, for foreground intents. For more information, see [Broadcast receiver timeout](/topic/performance/anrs/diagnose-and-fix-anrs#broadcast-receiver-anr).\n\nAvoid ANRs\n----------\n\nThe following are general tips to avoid ANRs. For more details about diagnosing\nand debugging different types of ANRs, see the other pages in this section.\n\n- Keep the main thread unblocked at all times, and use threads strategically.\n\n - Don't perform blocking or long-running operations on the app's main thread.\n Instead, create a worker thread and do most of the work there.\n\n - Try to minimize any lock contention between the main thread and other\n threads.\n\n - Minimize any non-UI related work on the main thread, such as when handling\n broadcasts or running services. Any method that runs in the UI thread must\n do as little work as possible on that thread. In particular, activities must\n do as little as possible to set up in key lifecycle methods, such as\n `onCreate()` and `onResume()`. See [Background work overview](/guide/background) for more\n information about available solutions for scheduling work on a background\n thread and communicating back with the UI.\n\n - Be careful when sharing thread pools between components. Don't use the same\n threads for potentially long-blocking operations and time-sensitive tasks\n such as broadcast receiving.\n\n | **Note:** Because such threading usually is accomplished at the class level, you can think of responsiveness as a class problem. Compare this with basic code performance, which is a method-level concern.\n- Keep app startup fast. Minimize slow or blocking operations in the app's\n startup code, such as methods run during dagger initialization.\n\n- If you're using `BroadcastReceiver`, consider running broadcast receivers in a\n non-main thread using [`Context.registerReceiver`](/reference/android/content/Context#registerReceiver(android.content.BroadcastReceiver,%20android.content.IntentFilter,%20java.lang.String,%20android.os.Handler,%20int)). For more information,\n see [ANRs in BroadcastReceiver](#anrs-in-broadcast-receiver).\n\n - If you use [`goAsync()`](/reference/android/content/BroadcastReceiver#goAsync()), make sure [`PendingResult.finish`](/reference/kotlin/android/content/BroadcastReceiver.PendingResult?#finish) is called quickly before the ANR timeout.\n\nANRs in BroadcastReceiver\n-------------------------\n\n`BroadcastReceiver` execution time is constrained because broadcast receivers\nare meant to do small, discrete amounts of work in the background, such as\nsaving a setting or registering a [`Notification`](/reference/android/app/Notification). So, as with other\nmethods called in the UI thread, apps must avoid potentially long-running\noperations or calculations in a broadcast receiver. Instead of performing\nlong-running tasks via the UI thread, perform them in the background for later\nexecution. See [Background work overview](/guide/background) for more information about possible\nsolutions.\n\nAnother common issue with `BroadcastReceiver` objects occurs when they execute\ntoo frequently. Frequent background execution can reduce the amount of memory\navailable to other apps. For more information about how to enable and disable\n`BroadcastReceiver` objects efficiently, see [Broadcasts overview](/guide/components/broadcasts).\n| **Tip:** You can use [`StrictMode`](/reference/android/os/StrictMode) to help find potentially lengthy operations such as network or database operations that you might accidentally be doing on your main thread.\n\nReinforce responsiveness\n------------------------\n\nGenerally, 100 to 200ms is the threshold beyond which users perceive slowness in\nan app. Here are additional tips for making your app seem responsive to users:\n\n- If your app is doing work in the background in response to user input, show\n that progress is being made, such as with a [`ProgressBar`](/reference/android/widget/ProgressBar) in your UI.\n\n- For games specifically, do calculations for moves in a worker thread.\n\n- If your app has a time-consuming initial setup phase, consider showing a\n [splash screen](/develop/ui/views/launch/splash-screen) or rendering the main view as quickly as possible.\n Indicate that loading is in progress and fill the information asynchronously.\n In either case, we recommend indicating somehow that progress is being made,\n so that the user doesn't perceive that the app is frozen.\n\n- Use performance tools such as [Perfetto](/topic/performance/tracing) and [CPU Profiler](/studio/profile/cpu-profiler) to\n determine bottlenecks in your app's responsiveness."]]