2013-01-09 15 views
5

Pobrałem bibliotekę jsoup jsoup-1.7.1.jar rdzenia i importowanych go do mojego projektu przy użyciu projektu -> Ustawienia-> Java Build Path -> Dodaj Słoiki zewnętrzne i wkleiłem plik biblioteki do mojego folderu libs. Jednak wydaje się, że jest jakiś problem z importowaniem biblioteki Jsoup do mojego projektu. Kiedy uruchomię swoją aplikację, po uruchomieniu otrzymuję ten błąd.Analizowanie z jsoup wyrzuca błąd (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 

Po wyszukaniu i prosząc I okazało się, że zaćmienie widzi jsoup.jar, ale nie można zapakować go do pliku APK dla aplikacji do uruchomienia. Starałem się zorganizować import o naciśnięcie Shift + Alt + O i chciałbym dostać ten sam błąd. W tym momencie nie jestem pewien, co jest nie tak i nie mam pojęcia, jak to naprawić. Mam tylko nadzieję, że ktoś poprowadzi mnie do rozwiązania. Doceń swój czas!

To jest mój kod:

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

} 

Odpowiedz

15

Masz

android.os.NetworkOnMainThreadException 

który nie ma nic wspólnego ze swoją jar działa prawidłowo, czy nie.

Wyjątek jest zgłaszany przez nowe wersje Androida, aby nie blokować wątku interfejsu użytkownika (który jest głównym wątkiem) wykonującym operacje sieciowe.

Użyj AsyncTask (proste wyjaśnienie na temat tego, co każda część AsyncTask można znaleźć here) lub inny Thread dla rzeczy sieciowych. Asynktask jest łatwiejszy w obsłudze, jeśli musisz zaktualizować interfejs użytkownika po zakończeniu pracy w tle.

Przykładem AsyncTask z bazy kodu mogą być:

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

Przypuszczam:

  • Zadanie jest wewnętrzna klasa w swojej działalności.
  • został przekazany tytuł zdobyć do UI elementu (np TextView), ponieważ to właśnie AsyncTasks są zazwyczaj wykorzystywane do.

Aby wywołać AsyncTask, umieścić to po setContentView(R.layout.activity_main);

new MyTask().execute(); 
+0

Dokładnie tak. @Questions, możesz użyć mojego DataLoadera do tego również: https://github.com/christopherperry/dataloader (bezwstydna wtyczka) –

+0

Zaktualizowałem moje pytanie i dodaję mój kod źródłowy. Czy możesz mi pokazać, jak używałbyś AsyncTask tutaj? Dzięki! – Questions

+0

@Questions Zaktualizowałem swoją odpowiedź na przykładzie. –

-3

importować te biblioteki android.os.NetworkOnMainThreadException i android.os.StrictMode i skorzystać z poniższego trybie ścisłym

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

dodać również tę linię manifestować:

<uses-permission android:name="android.permission.INTERNET" /> 
Powiązane problemy