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();