WebChromeClient.onConsoleMessage bremst UI Thread

  • Antworten:19
  • Geschlossen
Gelöschter Account
  • Forum-Beiträge: 6

06.05.2017, 20:38:26 via Website

Hi,
aktuell arbeite ich an einer App mit Webview die eine React Anwendung ausführt.
Von dessen Javascript Context werden eine Menge an console logs produziert, die ich an den Android Container analog wie z.B.

myWebView.setWebChromeClient(new WebChromeClient() {
  public boolean onConsoleMessage(ConsoleMessage cm) {
    Log.d("MyApplication", cm.message() + " -- From line "
                         + cm.lineNumber() + " of "
                         + cm.sourceId() );
    return true;
  }
});

weiterleite, um sie dort u.a. zu loggen (android-logback). Allerdings werden so häufig und umfangreich Messages empfangen, dass der UI-Thread anscheinend ausgebremst wird, was sich wiederum im WebView bemerkbar macht, der Teil der Main-Activity ist.
Wie würde ein "Umleiten" über einen Handler/Thread/Queue möglich sein?

Gruß,
Nic

— geändert am 06.05.2017, 20:41:41

swa00
  • Forum-Beiträge: 3.704

06.05.2017, 23:10:31 via Website

Hallo Nic,

versuche mal diesen Weg, der läuft bei mir einwandfrei
http://stackoverflow.com/a/27935969

P.S. Speziallist in solchen Sachen ist bei uns Pascal P. & Ludy - die werden sicherlich auch noch
Ihren wertvollen Senf dazu geben :-)

— geändert am 07.05.2017, 00:52:08

Liebe Grüße - Stefan
[ App - Entwicklung ]

Gelöschter Account
  • Forum-Beiträge: 6

07.05.2017, 13:08:14 via Website

Hi Stefan, danke fürs Feedback

Ich befürchte aber, dass wird mir nicht viel weiterhelfen.
Javascript logs werden schon massig erzeugt und im onConsoleMessage empfangen. Allerdings bremst dann der Logger dort den Main Thread massiv aus. Das Logging sollte ausserhalb des UI Threads stattfinden, wie man sowas mittels Handler oder Thread aber "umleitet" ist mir nicht klar. Da ist mir die Android Entwicklung zu neu.

Gruß,
Nic

swa00
  • Forum-Beiträge: 3.704

07.05.2017, 13:20:04 via Website

Hallo Nic ,

und was für Ergebnisse hast du , wenn du den WebView und einen WebViewClient
in einen Thread ( z.b. AsyncTask) einbaust ?
Und wie erwähnt , den WebChromeClient durch einen WebViewClient ersetzt
(Javascript Injection dann bei OnPageFinshed)

P.S. Ich verwende beides grundsätzlich in einem Thread, da ich bis zu 5 gleichzeitig laufen habe
(Ebook Anwendung)

— geändert am 07.05.2017, 13:28:52

Liebe Grüße - Stefan
[ App - Entwicklung ]

Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

07.05.2017, 13:59:14 via Website

Hallo nic,
was ist denn das für eine Seite bei der du so viele Logs bekommst?
Und warum brauchst du diese in der App?
Willst du eine Webseite auf Android debuggen? - Da gibt es deutlich einfachere Methoden als sich eine App zu schreiben..

Zum eigentlichen Problem:
Du brauchst einen richtigen Logger der Async loggen kann. Einfallen würde mir log4J aber das hab ich noch nie Async benutzt und weiß somit nicht ob das gescheit geht.
Zur not muss man sich das selber schreiben. Oder du machst dir eine Liste der ConsoleMessage Objekte und schreibst die Errors nur zyklisch raus, hast also eine Liste bzw. Queue die du dann abarbeitest und Loggst. Damit hast du zumindest mal keine Abhängigkeit von der Anzahl der Logs weil du ja unabhängig der WebView die Liste bearbeiten kannst.

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

Gelöschter Accountswa00

Gelöschter Account
  • Forum-Beiträge: 6

07.05.2017, 15:04:23 via Website

wenn du den WebView und einen WebViewClient
in einen Thread ( z.b. AsyncTask) einbaust ?

Oh, ich dachte der Webview gehört grundsätzlich in die main Activity. Man kann so ein UI Control also auch auf einen extra Thread legen?

Der Webview bei mir ist alles was das UI ausmacht. Der Android Container ist nur ein unsichtbarer Rahmen, der für die Kommunikation mit Rest-Server zuständig, eine Datenbank, Lesen und Speichern von RS232-Daten und die Configuration bereitstellt. Soweit bin ich noch nicht sondern habe mit Webview, Einbetten der React Webanw. und jetzt Log Infrastruktur angefangen. Zur Laufzeit wird man nur die Webanwend. im Fullscreen sehen und benutzen können. Natürlich könnte ich Remote Debuggen, aber die Logs müssen persistiert werden.

Und wie erwähnt , den WebChromeClient durch einen WebViewClient ersetzt
(Javascript Injection dann bei OnPageFinshed)

Das verstehe ich nicht, wo in dem Beispiel auf stackoverflow

// intercept calls to console.log
web.setWebChromeClient(new WebChromeClient() {
    public boolean onConsoleMessage(ConsoleMessage cmsg)
    {
        // check secret prefix
        if (cmsg.message().startsWith("MAGIC"))
        {
            String msg = cmsg.message().substring(5); // strip off prefix

...

// inject the JavaScript on page load
web.setWebViewClient(new WebViewClient() {
    public void onPageFinished(WebView view, String address)
    {
        // have the page spill its guts, with a secret prefix
        view.loadUrl("javascript:console.log('MAGIC'+document.getElementsByTagName('html')[0].innerHTML);");
    }
});

...

wird der ChromeClient ausgetauscht. Wenn ich das PageFinished richtig deute wird mit

view.loadUrl("javascript:console.log('MAGIC'+document.getElementsByTagName('html')[0].innerHTML);");

nur 1x das document element per console geloggt und würde nur 1x beim WebChromeClient.onConsoleMessage ausgelöst. Wo aber wird da ein WebChromeClient durch einen Webview getauscht?

— geändert am 07.05.2017, 15:12:10

Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

07.05.2017, 15:11:23 via Website

Garnicht, das sind komplett unterschiedliche Dinge.
WebView ist das eigentliche UI Element dass du siehst. Der WebChromClient ist nur ein Interface als Callback für verschiednene EReignisse.

Vielleicht willst du uns mal mitteilen warum du überhaupt die innerhtml oder so brauchst?

Denn das geht ohne ConsoleLog mit einem JavascriptInterface deutlich einfacher und erzeigt nicht so viele Einträge

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

swa00

swa00
  • Forum-Beiträge: 3.704

07.05.2017, 15:13:31 via Website

Hallo Nic,

Wo aber wird da ein WebChromeClient durch einen Webview getauscht?

Das habe ich nicht geschrieben : WebChromeClient durch WebClient austauschen

wird der ChromeClient ausgetauscht. Wenn ich das PageFinished richtig deute wird mit
view.loadUrl("javascript:console.log('MAGIC'+document.getElementsByTagName('html')[0].innerHTML);");

Richtig

Der Webview bei mir ist alles was das UI ausmacht.
Oh, ich dachte der Webview gehört grundsätzlich in die main Activity. Man kann so ein UI Control also auch auf einen extra Thread legen?

Du kannst auch genau so invisible WebView verwenden und diese dann im Thread laufen lassen.
Sowas mache ich im EBook auch , wenn ich im Hintergrund die Seiten zu berechnen habe.

Sinn und Zweck meiner Idee ist , dass du einen UI Hänger hast .
Es hindert dich niemand daran , eine Routine in einen Thread einzubinden und den nur für eine
evetuelle Berechnung zu vergewaltigen.

Ausserdem sollte man sich grundsätzlich angewöhnen, UI für sich arbeiten zu lassen und alles andere in
Thread / AsynTask zu verarbeiten - gib dem UI Luft

— geändert am 07.05.2017, 15:20:54

Liebe Grüße - Stefan
[ App - Entwicklung ]

swa00
  • Forum-Beiträge: 3.704

07.05.2017, 15:23:09 via Website

@Pascal : Du bist heute mal wieder auf Zack :-)

Liebe Grüße - Stefan
[ App - Entwicklung ]

Pascal P.

Gelöschter Account
  • Forum-Beiträge: 6

07.05.2017, 19:03:03 via Website

@ Pascal: Das mit dem innerHtml war in dem Beispiel von Stefan.

Sorry, ich verstehe noch nicht wie das von Stefan genannte Beispiel aus stockoverflow eine Verbesserung sein soll.
@Stefan
Was meintest du nun mit

Und wie erwähnt , den WebChromeClient durch einen WebViewClient ersetzt
(Javascript Injection dann bei OnPageFinshed)

Die Console.logs aus der Webanw. landen doch immer im WebChromeClient onConsoleMessage. Egal ob in der Webanwend. oder per Injection wie z.B. view.loadUrl("javascript:console.log...erzeugt.

Du kannst auch genau so invisible WebView verwenden und diese dann im Thread laufen lassen.

Das wird mir nichts bringen, der Webview muss in der Activity sichtbar bleiben. Threads i.A. zu benutzen zwecks Entlastung der UI ist mir bekannt, nur ist mir noch nicht klar wie ich die Messages die in onConsoleMessage reinlaufen, auf einen extra Thread oder AsyncTask programmatisch umleite/pipe/verarbeiten lasse.

swa00
  • Forum-Beiträge: 3.704

07.05.2017, 19:48:51 via Website

Hallo Nic,

reseten wir mal die Vorschläge :

a) du schreibst oben , dass dein Weg deine UI zum stottern bringt , also läuft was bei dir schief.
b) Wir sitzen hier und überlegen uns , woran es liege könnte und geben dir einen Tipp, wie wir es bei uns umgesetzt haben und wie es bei uns läuft. (ChromeClient ist was anderes als WebClient)
c) Als Antwort bekommen wir von dir , dass du nicht daran glaubst , dass das gehen wird , aber nicht , dass du es mal probiert hast :-)
d) Pascal bittet Dich , doch mal zu erklären , was du genau möchtest , damit wir für dich ggf einen anderen Ansatzweg aufzeigen können ( es gibt da Mehrere)
e) Dann gebe ich dir den Tip , - um die UI freizuschaufeln - es doch einfach mal mit einem invisible View in einem Thread umzusetzen - alleine um nur mal festzustellen, ob dein UI dann freiläuft.

Aber anscheinend magste das auch nicht machen :-)

Also was magst du denn haben ? - Die Silbertablett-Lösung ?

Ganz klare Frage an dich : Was hast du von unseren Vorschlägen schon umgesetzt , die wir auch selbst einsetzen ?
Was sind die Ergebnisse und warum ??

Du vermittelst eben den Eindruck , dass du mit dem Kopf durch die wand willst und unbedingt nach dem Fehler
in deinem Konzept suchst - Vielleicht ist der Weg ja völlig falsch für dein Vorhaben.

Ohne die Beantwortung der Frage von Pascal musst du sehrwahrscheinlich da dann selber durch .
Ich bin zumindest nicht mehr bereit zu Rätseln und dann doch nur eine Antwort zu bekommen,
dass du nicht dran glaubst.

Und wenn du nicht weisst, wie man das Ganze ggf in einem Thread umsetzt : Eigentlich ist das
eines der BasisDinge , die man unter Android benötigt .

Du möchtest Hilfe von uns - nicht umgekehrt , denn unser Krempel läuft

— geändert am 07.05.2017, 20:28:39

Liebe Grüße - Stefan
[ App - Entwicklung ]

Pascal P.

Gelöschter Account
  • Forum-Beiträge: 6

07.05.2017, 20:36:55 via Website

:) Also ich hatte in meinem 2.Beitrag erwähnt, dass die Android Entw. noch Neuland für mich ist.
Und da solltet ihr mir nachsehen dass ich bei dem einen oder anderen Beitrag nochmal nachfrage, damit der Knoten ev. platzt oder nicht.

Dass ich keine Programmfortschritte zeige, hat nix mit Ignoranz zutun sondern dem Umstand geschuldet, dass ich den Code hier nicht zur Hand habe noch eine passende IDE. Und mit dem Teil von Pascal war ich noch nicht soweit. Es sollte erstmal eine Diskussion sein.

Sorry, aber ich denke dass reicht für heute und danke für euren Support.
Gruß,
Nic

swa00

Ludy
  • Admin
  • Forum-Beiträge: 7.961

07.05.2017, 20:58:01 via Website

Hallo Nic,

herzlich willkommen hier im Forum (*)

ich habe jetzt mal getestet (WebChromeClient#onConsoleMessage) und zwar mit 56.000 Zeichen je Zeile (252 Zeilen insgesamt) und das war nicht mal ein Augenzwinkern und die Seite war geladen.
Also wenn dann läuft irgendetwas in deiner App schief.

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

☕ Buy Me A Coffee ☕

Lebensmittelwarnung-App

✨Meine Wunschliste✨

📲Telegram NextPit News📲

Gelöschter Accountswa00

swa00
  • Forum-Beiträge: 3.704

09.05.2017, 10:19:37 via Website

Dass ich keine Programmfortschritte zeige, hat nix mit Ignoranz zutun sondern dem Umstand geschuldet, dass ich den Code hier nicht zur Hand habe noch eine passende IDE. Und mit dem Teil von Pascal war ich noch nicht soweit. Es sollte erstmal eine Diskussion sein.

Das ist jetzt nicht dein Ernst - oder ?

Komme bitte dann wieder, wenn Du willig bist für dich selbst was zu tun.
Vorher brauchst du unsere wertvolle Zeit auch nicht in Anspruch zu nehmen.

— geändert am 09.05.2017, 13:52:46

Liebe Grüße - Stefan
[ App - Entwicklung ]

swa00
  • Forum-Beiträge: 3.704

09.05.2017, 12:47:18 via Website

nee Ludy .... :-) :-) :-) ^^

weiste , Fragen kann natürlich jemand stellen und wir alle sind ja recht schnell mit den Antworten..
(Pascal, Du, meiner einer ...)

Aber mal so ins Blaue reinfragen, Pascal & mich auf Zack halten und dann erklären ,
man würde nicht glauben, was wir geschrieben haben und dann auch noch mitteilen , dass
man eh nicht vor der Kiste sitzt und keine IDE vorhanden ist .. und dann die Frage nur als
"Diskussion" bezeichnen :-)

Na ja , dann darfst du schon mal deinem Unmut freien Lauf lassen :-)

— geändert am 09.05.2017, 13:53:26

Liebe Grüße - Stefan
[ App - Entwicklung ]

swa00
  • Forum-Beiträge: 3.704

09.05.2017, 12:55:30 via Website

... bin ja schon wieder auf dem Boden :-)

Alles wird gut :-)

Liebe Grüße - Stefan
[ App - Entwicklung ]

Gelöschter Account
  • Forum-Beiträge: 6

09.05.2017, 16:30:16 via Website

Geht man hier mit neuen Forenmitgliedern immer so um?

Komme bitte dann wieder, wenn Du willig bist für dich selbst was zu tun.
Vorher brauchst du unsere wertvolle Zeit auch nicht in Anspruch zu nehmen.

Wenn hier "besondere" Regeln gelten, macht diese unbedingt im Forum deutlich. Nicht dass hier irgendjemand sofort aus dem Anzug hüpft oder gar "traumatisiert" wird.(silly)

Das Ausbremsen des UI hat sich erstmal von selbst erledigt. U.U. war es einer schlechten LAN Verbindung der ADB Bridge geschuldet und/oder das Android Studio hat auf dem letzten Loch gepfiffen.

So! Mehr muss ich jetzt hier und jetzt nicht mehr für mich tun, oder so ähnlich:D

Ludy
  • Admin
  • Forum-Beiträge: 7.961

09.05.2017, 16:44:33 via Website

Hallo Nic,

diese Worte hättest Du dir jetzt auch schenken können (smug)

Scheinbar hast du noch sehr hohe Defizite, was die Sache Entwicklung von Apps und seine Werkzeuge angeht.

Die IDE ist dein AndroidStudio, daher wohl auch das Missverständnis - worauf sich Stefan bezogen hat.

Also bleibt friedlich zu einander!

Nic

So! Mehr muss ich jetzt hier und jetzt nicht mehr für mich tun, oder so ähnlich:D

Daraus lese ich das dann hier zu kann, sollte das nicht der Fall sein, kannst Du mich per PN erreichen.

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

☕ Buy Me A Coffee ☕

Lebensmittelwarnung-App

✨Meine Wunschliste✨

📲Telegram NextPit News📲

swa00