Wie zu verwenden AsyncTask für Parser Jsoup?
Ich bin versucht, einen AsyncTask, weil die activty Kraft schließt, weil es dauert zu lange auf dem Haupt-thread.
Hier ist, was ich verwenden möchten, die in einem DoInBackGround..
}
class fetcher extends AsyncTask<Void,Void, Void>{
@Override
protected Void doInBackground(Void... arg0) {
Document doc = null;
try {
doc = Jsoup.connect(url).get();
} catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
TextView article = (TextView)findViewById(R.id.releaseInfo);
final TextView featuresText = (TextView)findViewById(R.id.features);
//Get the overview div
Element overview = doc.select("div#object-overview").last();
Element featureList = doc.select("div.callout-box").last();
Elements features = featureList.select("li");
ListIterator<Element> featList = features.listIterator();
while (featList.hasNext()) {
featuresText.setText("Features: " + featList.next().text() + "\n");
}
//Get the paragraph element
Element paragraph = overview.select("p").last();
System.out.println(paragraph.text());
article.setText(paragraph.text());
return null;
}
}
}
es immer Kraft schließt weiß ich nicht, warum?
EDIT: Das ist der debug-error ist ich bekomme
08-16 18:52:59.547: WARN/System.err(27209): java.net.SocketTimeoutException
08-16 18:52:59.547: WARN/System.err(27209): at org.apache.harmony.luni.net.PlainSocketImpl.read(PlainSocketImpl.java:564)
08-16 18:52:59.547: WARN/System.err(27209): at org.apache.harmony.luni.net.SocketInputStream.read(SocketInputStream.java:61)
08-16 18:52:59.547: WARN/System.err(27209): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.readln(HttpURLConnectionImpl.java:1279)
08-16 18:52:59.547: WARN/System.err(27209): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.readServerResponse(HttpURLConnectionImpl.java:1351)
08-16 18:52:59.547: WARN/System.err(27209): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.sendRequest(HttpURLConnectionImpl.java:1339)
08-16 18:52:59.547: WARN/System.err(27209): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.doRequestInternal(HttpURLConnectionImpl.java:1656)
08-16 18:52:59.547: WARN/System.err(27209): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.doRequest(HttpURLConnectionImpl.java:1649)
08-16 18:52:59.557: WARN/System.err(27209): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:1374)
Mehr...
08-16 18:52:59.577: ERROR/AndroidRuntime(27209): FATAL EXCEPTION: AsyncTask #2
08-16 18:52:59.577: ERROR/AndroidRuntime(27209): java.lang.RuntimeException: An error occured while executing doInBackground()
08-16 18:52:59.577: ERROR/AndroidRuntime(27209): at android.os.AsyncTask$3.done(AsyncTask.java:200)
08-16 18:52:59.577: ERROR/AndroidRuntime(27209): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
08-16 18:52:59.577: ERROR/AndroidRuntime(27209): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
08-16 18:52:59.577: ERROR/AndroidRuntime(27209): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
08-16 18:52:59.577: ERROR/AndroidRuntime(27209): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
08-16 18:52:59.577: ERROR/AndroidRuntime(27209): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
08-16 18:52:59.577: ERROR/AndroidRuntime(27209): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
08-16 18:52:59.577: ERROR/AndroidRuntime(27209): at java.lang.Thread.run(Thread.java:1096)
08-16 18:52:59.577: ERROR/AndroidRuntime(27209): Caused by: java.lang.NullPointerException
08-16 18:52:59.577: ERROR/AndroidRuntime(27209): at com.fttech.htmlParser.HtmlparserExampleActivity$getGames.doInBackground(HtmlparserExampleActivity.java:156)
08-16 18:52:59.577: ERROR/AndroidRuntime(27209): at com.fttech.htmlParser.HtmlparserExampleActivity$getGames.doInBackground(HtmlparserExampleActivity.java:1)
Die NullPointerException Punkte, um diese Methode in der doInBackground()
Elements games = doc.select("tr> td.indexList1, tr > td.indexList2");
EDIT: ich bekomme diese Fehlermeldung, wenn es läuft auf android honeycomb
08-16 19:04:01.600: ERROR/AndroidRuntime(7302): Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
- Was ist der Fehler im logcat, bitte zeigen Sie den Fehler.
- Check out my Bearbeiten
Du musst angemeldet sein, um einen Kommentar abzugeben.
http://download.oracle.com/javase/1.5.0/docs/api/java/net/SocketTimeoutException.html
Du die Verbindung hat das Zeitlimit überschritten. Das ist, warum NPE geworfen wird, da Sie versuchen zu
.select("something")
von einem null-Objekt. Diedoc
Document
- Objekt null ist, da es keine Daten zurückgegeben, die von der url. Und so ist dieAsyncTask
Instanz wirftRuntimeException
.Überprüfen, ob Sie hinter proxy. Prüfen Sie, ob Sie Zugriff auf die url in Ihrem browser. Überprüfen Sie die DNS-des-emulator. Überprüfen Sie auch, für die Erlaubnis, das INTERNET in Ihrem manifest.
Plus: Aktualisieren der UI getan werden muss im UI-thread. ich.e Sie brauchen, um zu tun, dass in
onPostExecute()
Edit:
Document doc = null; ``while(doc==null)
try
diesecatch
dassIOException e
inException e
. Oder fügen Sie multi-catch-Anweisungen für alle Ausnahme, die Sie denken, die ausgelöst werden können durch parsings Operationen.Einem anderen problem mit Ihrem code-Beispiel: Die
doInBackground()
ist in einem separaten thread ausgeführt. Sie versuchen zu manipulieren zweiTextViews
von der hintergrund-thread, das ist nicht erlaubt, in Android.Aus der Android-SDK-docs:
Haben Sie zu bewegen, die Anrufe zu
TextView
zurück zu Ihrem Haupt-thread.AsyncTask
bietet Ihnen zwei integrierte Möglichkeiten, dies zu tun:onProgressUpdate()
undonPostExecute()
. Der code, den Sie in diesen Methoden werden Sie auf die Haupt-UI-thread.