Tyde / TuCanMobile

Besseres Interface für Android-Smartphones für das Studentenverwaltungssystem TuCan der TU Darmstadt
GNU General Public License v3.0
10 stars 2 forks source link

RuntimeException bei SimpleSecureBrowser #67

Closed Tyde closed 9 years ago

Tyde commented 9 years ago
Can't create handler inside thread that has not called Looper.prepare() at        com.dalthed.tucan.Connection.SimpleSecureBrowser.doInBackground(SimpleSecureBrowser.java:94) 

tritt auf, weil bei fehlender Internetverbindung versucht wird, ein Toast zu zeigen. SimpleSecureBrowser scheint wohl nicht den Context richtig zu haben. Das sollte durch einen Handler erledigt werden, welcher in der Activity ausgeführt wird.

http://dttyde.de:5984/acralyzer/_design/acralyzer/index.html#/reports-browser/tucan/bug/1ba2835495867bba8969289ff2b74709

dnlbauer commented 9 years ago

Toast's sollten immer im Application context ausgeführt werden damit sie unabhängig von der activity lifecycle sind: http://developer.android.com/guide/topics/ui/notifiers/toasts.html#Basics

Toast.makeText(TucanMobile.getApplicationContext(), "Keine Internetverbindung", Toast.LENGTH_LONG).show(); sollte das problem beheben.

dnlbauer commented 9 years ago

Oder liegt es vielleicht daran das der Toast hier in einem AsyncTask erzeugt wird? Normalerweise darf man ausserhalb des MainThreads keine GUI-Operationen ausführen. Bin mir jetzt aber nicht sicher ob Toasts dazuzählen. Dann müsste man die alle auslagern, zB in ein publishProgress(..)

Tyde commented 9 years ago

Ja das muss ich ausbessern, aber ich glaube das reicht nicht. Der Fehler tritt auf, da der Toast eben innerhalb von AsyncTast ausgeführt wird. Deswegen mach ich Handler rein, welche dann im GUI Task ausgeführt werden.

Edit: Ja genau das von deinem 2. Kommentar

dnlbauer commented 9 years ago

Kann gerade nicht testen aber versuch mal die Toasts durch publishProgress(int errorCode) zu ersetzen, zusammen mit der methode:

@Override
protected void onProgressUpdate(Integer... errorCode) {
    switch(errorCode[0])
    {
        case 1:
            Toast.makeText(TucanMobile.getApplicationContext(), .....)
            break;
        case 2:
            //.......
    }
}

und dann eben für jeden fehler einen anderen errorcode, oder direkt strings an onProgressUpdate übergeben.

onProgressUpdate läuft immer im MainThread, somit sollte das das problem lösen.

Tyde commented 9 years ago

Ich mach es einfach mit Runnables. Der Fehler ist leicht zu fixen: http://stackoverflow.com/questions/3875184/cant-create-handler-inside-thread-that-has-not-called-looper-prepare

dnlbauer commented 9 years ago

joa das ist im grunde genau das was onProgressUpdate im hintergrund macht :>

Tyde commented 9 years ago

So funktioniert jetzt mit e7025c5de9abc8a3c9ce7bfd0d688d74b26ff24a