The android.os.NetworkOnMainThreadException exception

In this article I explain a possible cause of android.os.NetworkOnMainThreadException and how to avoid it.
From the Android site you can read:
NetworkOnMainThreadException
The exception that is thrown when an application attempts to perform a networking operation on its main thread.
This is only thrown for applications targeting the Honeycomb SDK or higher…

Here is a sample developed for Gingerbread, API level 9:

  1. create an Android project called HttpClient
  2. edit the file AndroidManifest.xml

    where <uses-sdk android:minSdkVersion="9" /> means an API version earlier to Honeycomb (Gingerbread, API level 9), and <uses-permission android:name="android.permission.INTERNET"/> authorizes the application to perform an internet connection
  3. edit the file HttpClientActivity.java

This app is executed without errors.

If you specify an API level after Honeycomb, such as Ice Cream Sandwich, replacing the line <uses-sdk android:minSdkVersion="9" /> with <uses-sdk android:minSdkVersion="14" /> and you launch the application, you get the exception android.os.NetworkOnMainThreadException.

An easy way to avoid the exception is to insert the following code (which requires import android.os.StrictMode):

before the row connect() in HttpClientActivity.java
But this method is recommended in development environments only, the recommended method is to use the class AsyncTask.

An example is the following in which the code of the class HttpClientActivity.java is replaced by:

You can override not only doInBackground but also other methods of the AsyncTask class like OnPreExecute(), OnPostExecute(Result), publishProgress(Progress. ..).

30 Replies to “The android.os.NetworkOnMainThreadException exception”

  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. Gracias amigo.
    he perdido mas de 10 horas con este problema
    Al fin quedo solucionado gracias a ti.!!!!
    eress lo maximo. sigue asi.

  4. 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

  5. “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?

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.