L’eccezione android.os.NetworkOnMainThreadException

In questo articolo spiego una possibile causa dell’eccezione android.os.NetworkOnMainThreadException e i modi per evitarla.
Dal sito di Android si può leggere:
NetworkOnMainThreadException
L’eccezione che è lanciata quando un’applicazione tenta di eseguire un’operazione di rete nel suo thread principale.
E’ lanciata solo per le applicazioni con SDK Honeycomb o superiori…

Riporto un esempio sviluppato per Gingerbread, API level 9:

  1. crea un progetto Android di nome HttpClient
  2. modifica il file AndroidManifest.xml

    dove <uses-sdk android:minSdkVersion="9" /> indica una versione API antecedente a Honeycomb (Gingerbread, API level 9), e <uses-permission android:name="android.permission.INTERNET"/> autorizza l’applicazione a eseguire una connessione a internet
  3. modifica il file HttpClientActivity.java

Questa app è eseguita senza errori.

Se invece si specifica un API level superiore a Honeycomb, come ad esempio Ice Cream Sandwich, sostituendo la riga
<uses-sdk android:minSdkVersion="9" /> con <uses-sdk android:minSdkVersion="14" /> e si lancia l’applicazione, si ottiene l’eccezione android.os.NetworkOnMainThreadException.

Un modo semplice per evitare l’eccezione è quello di inserire il seguente codice (che richiede import android.os.StrictMode):

prima dell’istruzione connect() in HttpClientActivity.java
Ma questo metodo è consigliato solo in ambienti di sviluppo, il metodo raccomandato è l’utilizzo della classe AsyncTask.
Un esempio è il seguente in cui il codice della classe HttpClientActivity.java è sostituito da:

E’ possibile sovrascrivere altri metodi della classe AsyncTask oltre a doInBackground come onPreExecute(), onPostExecute(Result), publishProgress(Progress…).

30 risposte a “L’eccezione android.os.NetworkOnMainThreadException”

  1. You must be add this command
    ” if (android.os.Build.VERSION.SDK_INT > 9) {
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
    }”
    into protected void onCreate(Bundle savedInstanceState) for check android.os.build program.

    something like this.

    @SuppressLint(“NewApi”)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // sart this coding.——————————–
    if (android.os.Build.VERSION.SDK_INT > 9) {
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
    }
    // end coding ————————————
    ….

  2. Grazie, hai aiutato anche me! Se usate Xamarin (quindi C#), la sintassi equivalente corretta è:

    private class Connection : AsyncTask {
    protected override Java.Lang.Object DoInBackground(params Java.Lang.Object[] @params) {
    connect();
    return null;
    }
    }

  3. Thank you!

    You helped me after trying this crap (with MySQL Connection) for more than 10 hours!
    I am so grateful!

    GIVE THIS MAN A COOKIE!

    Greets from Austria,
    Daniel

  4. “An easy way to avoid the exception is to insert the following code (which requires import android.os.StrictMode):”
    Ciao Luca, complimenti per il blog. L’ho conosciuto per sbaglio tramite stackoverflow. Uno degli utenti ha postato questo post come possibile soluzione a un NetworkOnMainThreadException. Dato che utilizzare le policy StrictMode non e’ la soluzione, potresti modificarlo?

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.