Android NetworkOnMainThreadException


Esempio

Dalla documentazione :

L'eccezione che viene generata quando un'applicazione tenta di eseguire un'operazione di rete sul thread principale.

Questo viene lanciato solo per applicazioni che hanno come target l'SDK Honeycomb o superiore. Le applicazioni che hanno come target versioni precedenti dell'SDK sono autorizzate a fare networking sui loro thread del ciclo degli eventi principali, ma sono fortemente scoraggiate.

Ecco un esempio di un frammento di codice che può causare quell'eccezione:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Uri.Builder builder = new Uri.Builder().scheme("http").authority("www.google.com");
        HttpURLConnection urlConnection = null;
        BufferedReader reader = null;
        URL url;
        try {
            url = new URL(builder.build().toString());
            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setRequestMethod("GET");
            urlConnection.connect();
        } catch (IOException e) {
            Log.e("TAG","Connection error", e);
        } finally{
            if (urlConnection != null) {
                urlConnection.disconnect();
            }
            if (reader != null) {
                try {
                    reader.close();
                } catch (final IOException e) {
                    Log.e("TAG", "Error closing stream", e);
                }
            }
        }
    }
}  

Sopra il codice verrà NetworkOnMainThreadException per le applicazioni di targeting Honeycomb SDK (Android v3.0) o superiore poiché l'applicazione sta tentando di eseguire un'operazione di rete sul thread principale.

Per evitare questa eccezione, le operazioni di rete devono sempre essere eseguite in un'attività in background tramite AsyncTask , Thread , IntentService , ecc.

private class MyAsyncTask extends AsyncTask<String, Integer, Void> {

    @Override
    protected Void doInBackground(String[] params) {
        Uri.Builder builder = new Uri.Builder().scheme("http").authority("www.google.com");
        HttpURLConnection urlConnection = null;
        BufferedReader reader = null;
        URL url;
        try {
            url = new URL(builder.build().toString());
            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setRequestMethod("GET");
            urlConnection.connect();
        } catch (IOException e) {
            Log.e("TAG","Connection error", e);
        } finally{
            if (urlConnection != null) {
                urlConnection.disconnect();
            }
            if (reader != null) {
                try {
                    reader.close();
                } catch (final IOException e) {
                    Log.e("TAG", "Error closing stream", e);
                }
            }
        }

        return null;
    }
}