El análisis con jsoup lanza error (NetworkOnMainThreadException)
Descargé la biblioteca jsoup jsoup-1.7.1.jar core y la importé a mi proyecto usando el proyecto -> Propiedades-> Java Build Path -> Añadir jarras externas y pegué el archivo de biblioteca a mi carpeta de librerías. Sin embargo, parece que existe algún problema al importar la biblioteca Jsoup a mi proyecto. Cuando ejecuto mi aplicación, al iniciar consigo este error.
12-26 22:59:24.133: E/AndroidRuntime(6710): FATAL EXCEPTION: main 12-26 22:59:24.133: E/AndroidRuntime(6710): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.jsouptest/com.example.jsouptest.MainActivity}: android.os.NetworkOnMainThreadException
Después de buscar y preguntar, descubrí que eclipse ve el jsoup.jar, pero no puede empaquetarlo en el archivo APK para que se ejecute la aplicación. Intenté organizar Importaciones pulsando Mayús + Alt + O y obtendría el mismo error. En este punto, no estoy seguro de lo que está mal y no tengo idea de cómo solucionarlo. Sólo espero que alguien me lleve hacia la solución. Apreciar su tiempo!
- Uso de Jsoup en los datos de inicio de sesión de POST
- obtener img src con jsoup
- Problemas al pasar las cookies a la solicitud GET (después del POST)
- Cómo agregar niños a childnodes mediante el documento jsoup
- Análisis de JSoup: obtener el elemento siguiente
Este es mi código:
package com.example.jsouptest; import java.io.IOException; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import android.app.Activity; import android.os.Bundle; import android.view.Menu; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Document doc; try { doc = Jsoup.connect("http://google.com/").get(); String title = doc.title(); System.out.print(title); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; } }
- Android java.lang.NoClassDefFoundError: org.jsoup.Jsoup
- ¿Cómo agrego archivos .jar en Android Studio
- Jsoup no puede leer el archivo de retorno xml
- ¿Hay algo más rápido que Jsoup para el raspado de HTML?
- Analizar una miniatura de YouTube en un iframe con Jsoup
- El uso de un HashMap para almacenar grandes cantidades de datos está ralentizando mi aplicación de Android, ¿hay otras opciones?
- JSoup no analiza la página de problemas conocidos de Android
- Cómo agregar una nueva etiqueta html con Jsoup?
Usted tiene un
android.os.NetworkOnMainThreadException
Que no tiene nada que ver con su frasco funcionando correctamente o no.
La excepción es lanzada por las nuevas versiones de Android para que no bloquee el subproceso de interfaz de usuario (que es el subproceso principal) que realiza operaciones de red.
Utilice un AsyncTask (simple explicación sobre lo que cada parte del AsyncTask se puede encontrar aquí ) u otro hilo para cosas de red. Un Asynctask es más fácil de trabajar si necesita actualizar la interfaz de usuario una vez que termine el trabajo de fondo.
Un ejemplo de AsyncTask con su base de código puede ser:
private class MyTask extends AsyncTask<Void, Void, String> { @Override protected String doInBackground(Void... params) { String title =""; Document doc; try { doc = Jsoup.connect("http://google.com/").get(); title = doc.title(); System.out.print(title); } catch (IOException e) { e.printStackTrace(); } return title; } @Override protected void onPostExecute(String result) { //if you had a ui element, you could display the title ((TextView)findViewById (R.id.myTextView)).setText (result); } }
Asumo:
- La tarea es una clase interna en su Actividad.
- Usted está reenviando el título obtenido a un elemento de interfaz de usuario (por ejemplo, un
TextView
), ya que es lo que normalmente se utilizan AsyncTasks.
Para llamar a AsyncTask, poner esto después de setContentView(R.layout.activity_main);
new MyTask().execute();
Importe estas librerías android.os.NetworkOnMainThreadException
y android.os.StrictMode
y use debajo del modo estricto
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy);
También agregue esta línea a manifest:
<uses-permission android:name="android.permission.INTERNET" />
- ¿Cómo se puede cambiar el comportamiento de caché de disco por defecto en volley?
- Cambiar temporalmente el color dibujable