Saltar al contenido

¿Cómo reparar ‘android.os.NetworkOnMainThreadException’?

Solución:

NOTA: AsyncTask quedó obsoleto en el nivel de API 30.
https://developer.android.com/reference/android/os/AsyncTask

Esta excepción se produce cuando una aplicación intenta realizar una operación de red en su hilo principal. Ejecute su código en AsyncTask:

class RetrieveFeedTask extends AsyncTask<String, Void, RSSFeed> {

    private Exception exception;

    protected RSSFeed doInBackground(String... urls) {
        try {
            URL url = new URL(urls[0]);
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser parser = factory.newSAXParser();
            XMLReader xmlreader = parser.getXMLReader();
            RssHandler theRSSHandler = new RssHandler();
            xmlreader.setContentHandler(theRSSHandler);
            InputSource is = new InputSource(url.openStream());
            xmlreader.parse(is);

            return theRSSHandler.getFeed();
        } catch (Exception e) {
            this.exception = e;

            return null;
        } finally {
            is.close();
        }
    }

    protected void onPostExecute(RSSFeed feed) {
        // TODO: check this.exception
        // TODO: do something with the feed
    }
}

Cómo ejecutar la tarea:

En MainActivity.java archivo, puede agregar esta línea dentro de su oncreate() método

new RetrieveFeedTask().execute(urlToRssFeed);

No olvide agregar esto a AndroidManifest.xml expediente:

<uses-permission android:name="android.permission.INTERNET"/>

Casi siempre debe ejecutar operaciones de red en un hilo o como una tarea asincrónica.

Pero es Es posible eliminar esta restricción y anula el comportamiento predeterminado, si está dispuesto a aceptar las consecuencias.

Agregar:

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

StrictMode.setThreadPolicy(policy); 

En tu clase,

y

AGREGUE este permiso en el archivo manifest.xml de Android:

<uses-permission android:name="android.permission.INTERNET"/>

Consecuencias:

Su aplicación (en áreas de conexión a Internet irregular) dejará de responder y se bloqueará, el usuario percibe lentitud y tiene que hacer una eliminación forzada, y corre el riesgo de que el administrador de actividades elimine su aplicación y le diga al usuario que la aplicación se ha detenido.

Android tiene algunos buenos consejos sobre buenas prácticas de programación para diseñar con capacidad de respuesta: http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html

Resolví este problema usando un nuevo Thread.

Thread thread = new Thread(new Runnable() {

    @Override
    public void run() {
        try  {
            //Your code goes here
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
});

thread.start(); 
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *