Android Verhindern, dass Fragment Transaktion die UI blockt

Noahscript

Aktives Mitglied
Hallo zusammen,

in meiner Chat-App empfange ich verschiedene Pakete ohne Probleme.

Das Problem ist, wenn ich ein bestimmtes Paket erhalte. Zuerst sieht man kein Problem. Wenn man jedoch versucht zwischen den Registerkarten zu wechseln, nachdem dieses bestimmte Paket erhalten wurde, sieht man nur ein leeres Fragment bzw. die Benutzeroberfläche ist irgendwie blockiert. Ich verstehe nicht, warum dieses Problem auftritt, da jedes Paket auf der gleichen Weise sozusagen "verarbeitet" wird.

Das einzige, was mir aufgefallen ist, ist, dass ich beim Beitreten eines Raumes das Paket 44 (damit habe ich das Problem) zunächst gleich 5 Mal nacheinander bekomme. Vielleicht ist das eine Überlastung für die App??

Werft hier ein Blick rein:
Java:
case 44:
                                                            chatText = chatText + "<br><font color= #FFA500> 44 received</font>";
                                                            try {
                                                                s.chat.append(Html.fromHtml("<br><font color= #FFA500> 44 received</font>"));
                                                            } catch (Exception ex) {

                                                            }
                                                            break;

Man sieht, dass hier versucht wird in einen EditText ein Text hinzuzufügen. Sollte das nicht funktionieren (wenn die zweite Registerkarte nicht aktiv ist), dann wird ein bestimmtes Inhalt einem bestimmten String hinzugefügt. Dieses String wird vom zweiten Fragment gelesen sobald es auch ausgewählt wird. Ist meiner Meinung nach ganz normal, denn bei den anderen Pakete gibt es damit keine Probleme. Warum gibt es aber hier Probleme?


LG und viele Grüße
 
K

kneitzel

Gast
Also so ein catch Block nimmt zumindest mir jede Lust, sich mit so einem Thema auseinander zu setzen. Auch die enorme Einrückungstiefe gibt uns ja schon eine erste Idee, wie es um den Code bestellt sein müsste...

Also bei so einer Exception wäre wenigstens ein Log-Eintrag das absolute Minimum. Aber was für Exceptions können da auftreten? Was muss gefangen werden? Exception fange ich in der Regel so nie sondern nutze immer die spezifischen Exceptions.
 

Noahscript

Aktives Mitglied
Hallo kneitzel,


Also so ein catch Block nimmt zumindest mir jede Lust, sich mit so einem Thema auseinander zu setzen.
es tut mir Leid, dass ich dir das angetan habe. Bitte verzeihe mir meine Dummheit. Ich möchte hiermit dir eine Erklärung anbieten.


Auch die enorme Einrückungstiefe gibt uns ja schon eine erste Idee, wie es um den Code bestellt sein müsste..
Ich verspreche es dir: ich weiß nicht warum der Code so angezeigt wird. Bei mir sieht er geordnet aus. In Zukunft möchte ich drauf achten.


Also bei so einer Exception wäre wenigstens ein Log-Eintrag das absolute Minimum. Aber was für Exceptions können da auftreten? Was muss gefangen werden? Exception fange ich in der Regel so nie sondern
Am Anfang der Entwicklung bekam ich die Exception, dass der EditText auf den ich versuchte ein Text hinzuzufügen, null ist. Deswegen dieser Code:

Java:
chatText = chatText + "<br><font color= #FFA500> 44 received</font>"; //Text wird (sowieso) gespeichert
try {
    s.chat.append(Html.fromHtml("<br><font color= #FFA500> 44 received</font>")); //Hier wird versucht, den Text in den EditText hinzuzufügen
} catch (Exception ex) {
    // Falls das nicht funktioniert, dachte es wäre nicht notwendig die Ausnahme zu fangen, da ich meiner Meinung nach nichts damit anfange
}
Bis zu diesem Punkt war es mir nicht bewusst, dass ein Log-Eintrag das absolute Minimum ist.

Aber dann hast du diese Fragen gestellt:
Aber was für Exceptions können da auftreten? Was muss gefangen werden?
Und weil ich dir eine ausführliche Antwort geben wollte, habe ich es noch einmal getestet. Tatsächlich erschien da eine andere Ausnahme. Ich habe nämlich versucht von einem Thread aus Text in diesen EditText hinzuzufügen. Und obwohl das trotzdem geht, wird folgende Ausnahme ausgelöst:
android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
Ich denke das würde erklären, warum irgendwann die UI geblockt wird...

Am Ende brauchte ich kein try-catch-Block mehr.

Ich möchte in Zukunft diesbezüglich dich nie mehr ärgern, OK?

OK. Du bist sehr gut
 
K

kneitzel

Gast
Sorry, aber wie kannst Du Dir so Aussagen zum CODE so zu Herzen nehmen? Wer Deinen Code kritisiert, kritisiert Dich? Mir fehlt hier ehrlich gesagt jedes Verständnis!

Ich verspreche es dir: ich weiß nicht warum der Code so angezeigt wird. Bei mir sieht er geordnet aus. In Zukunft möchte ich drauf achten.
Es geht nicht um das geordnet angezeigt - ich habe vermutet, dass die Einrücktiefe recht hoch ist - Das mag falsch sein - aber in der Regel wird beim Copy&Paste Code nicht so weit eingerückt gezeigt. Du kannst gerne mehr vom Code zeigen, dann revidiere ich das.

Bis zu diesem Punkt war es mir nicht bewusst, dass ein Log-Eintrag das absolute Minimum ist.
Ja, daher wurdest Du darauf hingewiesen. Wenn eine Exception geworfen wird und Du das noch nicht einmal mitbekommst, dann ist das eine blöde Situation. Die willst Du nicht...
Und weil ich dir eine ausführliche Antwort geben wollte, habe ich es noch einmal getestet.
Für mich musst Du da gar nichts testen. Mir ist Dein Code scheiß egal. Du kannst auch so viele Exceptions ignorieren, wie Du willst. Du willst Hilfe haben. Und entweder ich habe mit meiner Art und Weise, die Dich so sehr gestört hat, auch alle anderen so verunsichert, dass sich niemand getraut hat, hier im Thread etwas zu schreiben oder denen ich auch nicht sehr viel mehr eingefallen zu Deiner Problematik. Denn Du kannst davon ausgehen, dass sich einige Leute den Thread angesehen haben ... und wenn einer da mehr Hilfe hätte geben können, dann wäre das bestimmt geschehen!

Und siehe da - schon logst Du Exceptions und Du bekommst die Exception zu sehen. Und wir erfahren auch deutlich mehr Details (Die Du uns nicht im ursprünglichen Post gegeben hast obwohl sie wichtig waren...): Du versuchst, die Oberfläche aus einem anderen Thread heraus zu verändern. Das ist etwas, das eigentlich bei allen GUIs problematisch ist und jedes UI Framework bietet hier eine Lösung. Und bei Android Activities ist es Activity.runOnUiThread:

Ich möchte in Zukunft diesbezüglich dich nie mehr ärgern, OK?

OK. Du bist sehr gut
Also ich weiss nicht was Du möchtest und es ist mir auch komplett egal. Was Du von mir bekommen hast waren Hinweise zu dem Code. Mir ist es relativ egal, ob Du das pers nimmst, nun eingeschnappt bist, mich als böse empfindest oder was auch immer. Mir ist es auch egal, ob Du Dir diese Hinweise zu Herzen nimmst und Deine Entwickler-Fähigkeiten ausbaust oder nicht. Das interessiert mich schlicht nicht!

Ich freue mich aber, dass Du den Fehler durch das Loggen der Exception herausfinden konntest und das Problem dann auch lösen konntest.
Vielleicht nimmst Du Dir es zu herzen, so dass Du zukünftig Exceptions zumindest in das Log schreibst um dann so eine Exception weiter geben zu können. Dann können wir Dir ggf. auch Hinweise zu der Problematik geben (So wie der Hinweis zu dem runOnUiThread).
 
K

kneitzel

Gast
Eine NullPointerException fängt man nicht ab. Die verhindert man, indem man einfach nicht auf was zugreift, weil null ist.
Alternativ prüft man auf null und macht einfach nichts, das die NPE auslöst. Das ist ja auch kein unübliches "Pattern".

Aber jetzt bist Du böse und nicht ich, weil Du sein Code / Vorgehen beim Entwickeln kritisiert hast :) Aber ich bin sicher: Er wollte Dich damit nicht ärgern ... auch wenn es Dich bestimmt auch etwas wurmt/ärgert/was auch immer, wenn Du sowas siehst :) Oder warum war das nicht so betont? :p
 

Noahscript

Aktives Mitglied
Für mich musst Du da gar nichts testen. Mir ist Dein Code scheiß egal. Du kannst auch so viele Exceptions ignorieren, wie Du willst. Du willst Hilfe haben. Und entweder ich habe mit meiner Art und Weise, die Dich so sehr gestört hat, auch alle anderen so verunsichert, dass sich niemand getraut hat, hier im Thread etwas zu schreiben oder denen ich auch nicht sehr viel mehr eingefallen zu Deiner Problematik.
Mir ist es relativ egal, ob Du das pers nimmst, nun eingeschnappt bist, mich als böse empfindest oder was auch immer.
Es war nicht meine Absicht dir zu vermitteln, dass deine Art und Weise mich gestört haben. Ich wollte mit meiner Antwort auch nicht ausdrücken, dass du böse bist. Ich weiß nicht, wie du darauf kommst. Und ich bin auch nicht sauer. Tut mir Leid wenn es bei dir so ankam. Bitte verzeihe mir heute nur noch einmal mehr.


Du versuchst, die Oberfläche aus einem anderen Thread heraus zu verändern. Das ist etwas, das eigentlich bei allen GUIs problematisch ist und jedes UI Framework bietet hier eine Lösung. Und bei Android Activities ist es Activity.runOnUiThread:
Was ich persönlich toll finde ist, dass ich das alles als neues Stoff gelernt habe, weil du mir diese Fragen gestellt hast? Aus einer Frage begann ich zu recherchieren und auf neue Ergebnisse zu stoßen.


Ich freue mich aber, dass Du den Fehler durch das Loggen der Exception herausfinden konntest und das Problem dann auch lösen konntest.
Ich freu mich, dass dies dir nicht 💩 egal ist.


Vielleicht nimmst Du Dir es zu herzen, so dass Du zukünftig Exceptions zumindest in das Log schreibst um dann so eine Exception weiter geben zu können. Dann können wir Dir ggf. auch Hinweise zu der Problematik geben (So
Das möchte ich mir vornehmen 👍

Eine NullPointerException fängt man nicht ab. Die verhindert man, indem man einfach nicht auf was zugreift, weil null ist.
Danke für den Hinweis.

Hoffentlich ist diese Dummheit bei mir in Zukunft damit beseitigt.
 

Ähnliche Java Themen

Neue Themen


Oben