2013-01-09 9 views
5

Ho scaricato la libreria jsoup nucleo jsoup-1.7.1.jar ed importato al mio progetto utilizzando il Progetto -> Proprietà-> Java Build Path -> Aggiungi Vasi esterni e ho incollato il file della libreria nella mia cartella libs. Tuttavia sembra esserci qualche problema nell'importazione della libreria Jsoup nel mio progetto. Quando eseguo la mia app, all'avvio ricevo questo errore.analisi con jsoup tiri errore (NetworkOnMainThreadException)

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 

Dopo la ricerca e chiedendo ho scoperto che eclisse vede il jsoup.jar, ma incapace di confezionarlo in un file APK per l'applicazione per l'esecuzione. Ho provato ad organizzare le importazioni premendo Maiusc + Alt + O e otterrei lo stesso errore. A questo punto, non sono sicuro di cosa sia sbagliato e non ho idea di come risolverlo. Spero solo che qualcuno mi guidi verso la soluzione. Apprezzo il tuo tempo!

Questo è il mio codice:

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; 
    } 

} 

risposta

15

Hai un

android.os.NetworkOnMainThreadException 

che non ha nulla a che fare con il vostro vaso funziona correttamente o meno.

L'eccezione viene generata dalle nuove versioni di Android in modo da non bloccare il thread dell'interfaccia utente (che è il thread principale) facendo operazioni di rete.

Utilizzare un AsyncTask (è possibile trovare una spiegazione semplice su ciascuna parte di AsyncTask here) o un altro Thread per le risorse di rete. Un Asynctask è più facile da lavorare se è necessario aggiornare l'interfaccia utente una volta completato il lavoro in background.

Un esempio di AsyncTask con la vostra base di codice può essere:

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

presumo:

  • Il compito è un interno classe nella vostra attività.
  • Si sta inoltrando il titolo a un elemento dell'interfaccia utente (ad esempio un TextView) poiché questo è quello per cui vengono utilizzati solitamente i servizi Async.

Per chiamare l'AsyncTask, mettere questo dopo setContentView(R.layout.activity_main);

new MyTask().execute(); 
+0

Completamente giusto. @Questions, puoi usare anche il mio DataLoader per questo: https://github.com/christopherperry/dataloader (plug shameless) –

+0

Ho aggiornato la mia domanda e aggiunto il mio codice sorgente. Puoi mostrarmi come useresti AsyncTask qui? Grazie! – Questions

+0

@Questions Ho aggiornato la mia risposta con un esempio. –

-3

importare questi biblioteca android.os.NetworkOnMainThreadException e android.os.StrictMode e utilizzare al di sotto modalità rigorosa

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

aggiungere anche questa linea di manifestare:

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