La razón principal del error de excepción Network On Main Thread se debe a que las versiones más nuevas de Android son muy estrictas contra el abuso de subprocesos de la interfaz de usuario. Cada vez que abrimos una aplicación, se crea un nuevo hilo «principal» que ayuda a las aplicaciones a interactuar con los componentes en ejecución de la interfaz de usuario de una aplicación y es responsable de enviar eventos a los widgets asignados. Toda la interfaz de usuario se bloquea cuando se realizan acciones que consumen mucho tiempo en el subproceso de la interfaz de usuario.
Cuando una aplicación intenta realizar operaciones de red en el subproceso principal, se genera un error de excepción de red en el subproceso principal. El error se muestra en todas las aplicaciones dirigidas a Honeycomb SDK o superior. Las aplicaciones se deshabilitan para descargar archivos, conectarse a una base de datos MySQL remota, realizar requests HTTP o establecer una conexión de socket.
Soluciones
La solución es envolver completamente cualquier tarea que intente realizar acciones como descargar archivos, conectarse a una base de datos MySQL remota, realizar requests HTTP o establecer una conexión de socket en una función asíncrona separada. La función asíncrona crea un nuevo subproceso y, por lo tanto, estos procesos no se ejecutan en el subproceso de la interfaz de usuario. También podemos anular la instrucción, pero en esta situación, es posible que el administrador de tareas deba eliminar la aplicación y hará que la aplicación no responda.
Solución 1
Para superar esta situación, agregue lo siguiente a la clase donde el usuario está realizando operaciones de red:
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy);
Agregue los siguientes permisos al archivo manifest.xml:
<uses-permission android:name="android.permission.INTERNET"/>
Solución 2
Para solucionar este problema usaremos un nuevo Thread
Ejemplo:
Thread thread = new Thread(new Runnable() { @Override public void run() { try { // Your code goes here } catch (Exception e) { e.printStackTrace(); } } }); thread.start();
Solución 3
- No use modo estricto (solo en modo de depuración)
- No cambie la versión del SDK
- No use un hilo separado
Solución 4
Cuando una aplicación intenta realizar operaciones de red en el subproceso principal, se genera un error de excepción de red en el subproceso principal.
Ejemplo:
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; } } protected void onPostExecute(RSSFeed feed) { // TODO: check this.exception // TODO: do something with the feed } }
Solución 5
Para la ejecución de la tarea en el archivo MainActivity.java , agregaremos esta línea dentro del método onCreate()
new RetrieveFeedTask().execute(urlToRssFeed);
y no olvide agregar esto al archivo AndroidManifest.xml:
<uses-permission android:name="android.permission.INTERNET"/>
Publicación traducida automáticamente
Artículo escrito por portalpirate y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA