thread exiting with uncaught exception

  • Antworten:8
  • OffenNicht stickyBentwortet
  • Forum-Beiträge: 4

20.08.2014, 21:47:29 via Website

Hallo,
ich experimentiere gerade mit Threads. Ich starte einen Service aus einer Activity. In dem Service rufe ich eine Methode auf die die Netzwerkverbindung prüft und eine entsprechende Ausgabe liefert. Diese Methode möchte ich in einem Thread aufrufen. Anbei der Code . . .

Thread t = new Thread() {
@Override
public void run() {
Log.i(LOGTAG, "Thread gestartet";);
checkNetworkConnection();
}
};
t.start();

Die App stürzt beim Aufruf des Threads allerdings ab. Folgendes wird im Logcat ausgegeben . . .

threadid=7: thread exiting with uncaught exception (group=0x4001d800)
E/AndroidRuntime( 486): FATAL EXCEPTION: Thread-8
E/AndroidRuntime( 486): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
E/AndroidRuntime( 486): at android.os.Handler.<init>(Handler.java:121)
E/AndroidRuntime( 486): at android.widget.Toast.<init>(Toast.java:68)
E/AndroidRuntime( 486): at android.widget.Toast.makeText(Toast.java:231)
E/AndroidRuntime( 486): at de.matze.todo.NetworkCheckService.checkNetworkConnection(NetworkCheckService.java:144)
E/AndroidRuntime( 486): at de.matze.todo.NetworkCheckService.access$0(NetworkCheckService.java:127)
E/AndroidRuntime( 486): at de.matze.todo.NetworkCheckService$1.run(NetworkCheckService.java:112)

Für ein paar Ratschläge wär ich sehr dankbar.

Matze

Antworten
  • Forum-Beiträge: 282

20.08.2014, 22:01:32 via Website

Hallo!

Meines wissens kannst du dass nur innerhalb eines UI Threads und nicht in einem Worker Thread machen.

runOnUiThread(new Runnable() {
   public void run() {
      checkNetworkConnection(); 
   }
});

LG Jakob

Antworten
  • Forum-Beiträge: 11.137

20.08.2014, 22:03:58 via Website

@Jakob: Dann würde das ganze ja wieder im Mainthread laufen.
Ich denke dass wollte er umgehen.

Wie sieht denn der code der checkNetworkConnection Methode aus.
Dort darfst du keine UI Elmente ändern oder ein Toast anzeigen

— geändert am 20.08.2014, 22:23:16

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
  • Forum-Beiträge: 4

21.08.2014, 07:39:56 via Website

Das mit dem Toast ist ein guter Hinweis. Werd ich mal testen.
Warum darf hier kein Toast verwendet werden ?

Antworten
  • Forum-Beiträge: 282

21.08.2014, 08:07:50 via App

Da ein Worker-Thread keine Erlaubnis hat auf solche Elemente zuzugreifen bzw. nicht zugreifen kann.

LG Jakob

Antworten
  • Forum-Beiträge: 4

21.08.2014, 08:30:10 via Website

Toasts aus der Methode entfernt, Thread funktionert. :D
Vielen Dank für die Unterstützung !

Antworten
  • Forum-Beiträge: 235

21.08.2014, 08:52:00 via Website

Hallo matze,

Toasts aus der Methode entfernt, Thread funktionert.

hmmm ....
ich habe irgendwo auf ein "Code gestolpert", wo die NetworkConnection mit zwei
"normalen" Threads realisiert war. Habe es nicht getestet - nur gesehen!
Ob es funktioniert hat -> ?
Aber alles was mit Network zu tun hat, sollte man mit AsyncTask lösen.
(Also nehme es als ungeschriebene Gesetz -> Net = AsyncTask!)
Was den Toast betrifft, hier haben sich die beiden Helfer irgendwie "auseinander geredet".
Schau mall bitte in die API:
und lese die Protected Methods.

.... Runs on the UI thread ....
.... Runs on the UI thread ...

Bei meinen Testen mit Network habe ich in der onPostExecute(...) Methode mir einfach eine Bestätigung (dass meine Data an ... gesendet wurden) mit Toast anzeigen lassen.

private class MyAsyncTask extends AsyncTask ....
...
...
protected void onPostExecute(Result result){
....            
Toast.makeText(getApplicationContext(), "command sent to", Toast.LENGTH_LONG).show();
}
...

Also du DARFST! den Toast (werde sagen überall nach bedarf) verwenden.

LG
Georg

Sorry für Gramatik & Stilistik Fehler.

Antworten
  • Forum-Beiträge: 11.137

21.08.2014, 10:47:02 via App

Ja aber nur solange der Toast im Mainthread ausgeführt wird.
Das gleiche gilt auch für UI Elemente

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten