
blackfire185
Stamm-User
- 40
Hallo,
ich benutze einen Service und einen Timer, um in regelmäßigen Abständen eine Webseite auf neugikeiten zu scannen. Allerdings bekomme ich manchmal eine SocketTimeoutException, wenn sich JSoup die Webseite lädt. Allerdings geschieht die nur ab und zu und ist nicht reproduzierbar.
Der Timer läuft aller 5min.
Wenn ich das richtig verstehe, ist ein Timeout ja, wenn die Verbindung zu lange dauert, also zb wenn das internet sehr langsam ist. Bei mir gabs diese Fehlermeldung allerdings im WLAN, das verwundert mich.
Liegt es daran, dass während der Verbindung das Internet abbricht?
Das ist die einzige Möglickeit die mir einfällt.
Mein Code der run Methode des Timers:
@Override
public void run() {
//Prüfen ob internetverbindung vorhanden
ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
String url ="http://www.webseite.html";
//Laden der Webseite und entfernen aller HTML Tags laut JSoup Documentation
Document doc = null;
try {
doc = Jsoup.connect(url).get();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String text = doc.body().text(); //text enrhält dann den sichtbaren Text einer Webseite
String split[]= text.split("#");//String zerteilen
SharedPreferences prefs = getSharedPreferences("sp",MODE_WORLD_READABLE);
Editor ed =prefs.edit();
//Schreiben wann letzte Verbindung stattfand
ed.putString("lastcheck", "Letzte Verbindung: "+ getzeit()); //gettzeit liefert in einem String die aktuelle Zeit
//prüfen ob letzter String der von der Webseite runtergeladen wurde gleich dem aktuellen String ist
if (split[0].equals(prefs.getString("laststring", "firststart"))){
}else{ // text ungleich gespeichertem --> neuer string
Notify("Neugikeit auf der Webseite","Neuigkeiten auf der Webseite", "zum Anzeigen berühren" );
ed.putString("laststring", split[0]);
}
//weitere Prüfung auf Neuigkeiten gleiches Prinzip wie eben
if (split[2].equals(prefs.getString("lasteilmeldung", "no meldung before"))){ // für Eilmeldung
ed.putBoolean("neweil", false);
}else{// neuer String
Notifyeilmeldung(split[1],split[2], split[3] );
ed.putString("lasteilmeldung", split[2]);
ed.putBoolean("neweil", true);//boolean die repräsentiert ob es eine Neuigkeit gibt (true) oder nicht (false)
}
ed.commit();
}else{ //if Abfrage nach Verbindung zum Internet vorhanden, else = wenn keine Verbindung vorhanden ist
ed.putString("lastcheck", "Verbindung fehlgeschlagen: "+ getzeit());
ed.commit();
}
}
}
Ich finde hier keinen Fehler, der nur manchmal auftritt.
Ich hoffe ihr könnt mir helfen.
Danke
ich benutze einen Service und einen Timer, um in regelmäßigen Abständen eine Webseite auf neugikeiten zu scannen. Allerdings bekomme ich manchmal eine SocketTimeoutException, wenn sich JSoup die Webseite lädt. Allerdings geschieht die nur ab und zu und ist nicht reproduzierbar.
Code:
W/System.err( 6681): java.net.SocketTimeoutException
W/System.err( 6681): at org.apache.harmony.luni.net.PlainSocketImpl.read(PlainSocketImpl.java:461)
W/System.err( 6681): at org.apache.harmony.luni.net.SocketInputStream.read(SocketInputStream.java:85)
W/System.err( 6681): at org.apache.harmony.luni.net.SocketInputStream.read(SocketInputStream.java:65)
W/System.err( 6681): at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:140)
W/System.err( 6681): at java.io.BufferedInputStream.read(BufferedInputStream.java:225)
W/System.err( 6681): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.readLine(HttpURLConnectionImpl.java:660)
W/System.err( 6681): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.readResponseHeaders(HttpURLConnectionImpl.java:690)
W/System.err( 6681): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.retrieveResponse(HttpURLConnectionImpl.java:1040)
W/System.err( 6681): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:726)
W/System.err( 6681): at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:412)
W/System.err( 6681): at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:393)
W/System.err( 6681): at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:159)
W/System.err( 6681): at org.jsoup.helper.HttpConnection.get(HttpConnection.java:148)
W/System.err( 6681): at de.serviceapp.Checkservice$1.run(Checkservice.java:68)
W/System.err( 6681): at java.util.Timer$TimerImpl.run(Timer.java:284)
E/AndroidRuntime( 6681): FATAL EXCEPTION: Timer-0
E/AndroidRuntime( 6681): java.lang.NullPointerException
E/AndroidRuntime( 6681): at de.serviceapp.Checkservice$1.run(Checkservice.java:74)
E/AndroidRuntime( 6681): at java.util.Timer$TimerImpl.run(Timer.java:284)
Der Timer läuft aller 5min.
Wenn ich das richtig verstehe, ist ein Timeout ja, wenn die Verbindung zu lange dauert, also zb wenn das internet sehr langsam ist. Bei mir gabs diese Fehlermeldung allerdings im WLAN, das verwundert mich.
Liegt es daran, dass während der Verbindung das Internet abbricht?
Das ist die einzige Möglickeit die mir einfällt.
Mein Code der run Methode des Timers:
@Override
public void run() {
//Prüfen ob internetverbindung vorhanden
ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
String url ="http://www.webseite.html";
//Laden der Webseite und entfernen aller HTML Tags laut JSoup Documentation
Document doc = null;
try {
doc = Jsoup.connect(url).get();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String text = doc.body().text(); //text enrhält dann den sichtbaren Text einer Webseite
String split[]= text.split("#");//String zerteilen
SharedPreferences prefs = getSharedPreferences("sp",MODE_WORLD_READABLE);
Editor ed =prefs.edit();
//Schreiben wann letzte Verbindung stattfand
ed.putString("lastcheck", "Letzte Verbindung: "+ getzeit()); //gettzeit liefert in einem String die aktuelle Zeit
//prüfen ob letzter String der von der Webseite runtergeladen wurde gleich dem aktuellen String ist
if (split[0].equals(prefs.getString("laststring", "firststart"))){
}else{ // text ungleich gespeichertem --> neuer string
Notify("Neugikeit auf der Webseite","Neuigkeiten auf der Webseite", "zum Anzeigen berühren" );
ed.putString("laststring", split[0]);
}
//weitere Prüfung auf Neuigkeiten gleiches Prinzip wie eben
if (split[2].equals(prefs.getString("lasteilmeldung", "no meldung before"))){ // für Eilmeldung
ed.putBoolean("neweil", false);
}else{// neuer String
Notifyeilmeldung(split[1],split[2], split[3] );
ed.putString("lasteilmeldung", split[2]);
ed.putBoolean("neweil", true);//boolean die repräsentiert ob es eine Neuigkeit gibt (true) oder nicht (false)
}
ed.commit();
}else{ //if Abfrage nach Verbindung zum Internet vorhanden, else = wenn keine Verbindung vorhanden ist
ed.putString("lastcheck", "Verbindung fehlgeschlagen: "+ getzeit());
ed.commit();
}
}
}
Ich finde hier keinen Fehler, der nur manchmal auftritt.
Ich hoffe ihr könnt mir helfen.
Danke