WebView, JavaScript inject & Jsoup seite auslesen Frage

  • Hey Leute,


    ich bin noch relativ neu in Android, habe vor längerer Zeit mal Java gelernt (1 Semester Info vor 3 Jahren) und bringe mir gerade Android bei (der eigene CookieClicker geht jedenfalls ^^ ). Hab schon 2 Bücher durchgepaukt (was man "gratis" über die Uni eben so bekommt), aber konnte noch nichts wirklich weiterführendes zum Thema WebView finden. Jetzt dachte ich mir: versuch mal was praktischeres und bastel dir eine gute App für einen xbeliebigen WebShop nach. Ich habe einige Indische Tutorials durchgeschaut und bin bis jetzt eigtl sehr zufrieden. Vom Interface habe ich eigentlich fast alles, was es braucht. Ich binde eine responsive Webside ein, hab NavDrawer mit Links, Suchleiste, einen schönen SplashScreen, Processbars für den Seitenwechsel, per Firebase kann ich Nachrichten an die Nutzer schicken - was will man mehr? :thumbup: .


    Im Prinzip habe ich auch nur noch das folgende Problem, bei dem ich noch nicht so wirklich eine funktionierende Lösung finden konnte. Ich möchte einen WebView laden, allerdings ein paar Jscript Klassen von der Seite runternehmen, weil die da einfach unpassend sind. Gelöst habe ich das, indem ich in der onPageFinished() Funktion einfach nur im Nachhinein sowas lade

    Code
    webView.loadUrl("javascript:(function() { " + "document.getElementsByClassName('menu')[0].style.visibility = 'hidden'; "  + "})()");


    Der Code funktioniert auch super. Leider scheint es so zu sein, dass er die Seite halt erst lädt und das Script erst bis zu 3-4 Sekunden später ausgeführt wird. Im Ergebnis sieht man, wie das Jscript da ist und sich dann erst ausblendet, was sehr unschön ist. Ich habe bereits diverese Workarounds versucht, aber konnte mir noch nicht helfen. Wenn möglich, würde ich gerne diesen "Lag" beseitigen. Eine Hilfestellung scheint das hier zu sein: stackoverflow.com . Leider scheine ich die entsprechende Lösung nicht ganz zu verstehen, hat jemand eine Ahnung, wie ich das erfolgreich einbauen kann? Vllt ein Codesample, das funktioniert? Auf seinem Blog scheint der Antwortsteller folgendes vorzuschlagen, was ich einfach nicht richtig hinbekomme: http://android-know-how-to.blo…ascript-onpagefinish.html . Er macht sich eine eigene onLoad() Methode und lädt alles irgendwie über ein @JavascriptInterface . Ich hab versucht, das nachzubauen, bekomme es aber einfach nicht hin.


    Desweiteren eine eher allgemeine Frage: ich dachte mir, dass ich mit Jsoup gewisse Elemente aus der Seite auslesen (Links für meinen Navdrawer, die jetzt noch hardcoded sind und Anzahl der Produkte im Warenkorb). Ist Jsoup sehr Datenhungrig? ich möchte nämlich eine möglichst niedrigen Datenverbrauch anstreben. Er muss nämlich auf jeden Seitenwechsel bei onPageFinished() den Warenkorb auslesen.


    Ich möchte nochmal ausdrücklich darauf Hinweisen: das hier ist keine Hausaufgabe oder sowas, sondern nur privates Interesse. Irgendwie hat das klein Angefangen, aber nun habe ich 5 Klassen und ca. 600 Zeilen Code sowie etliche Stunden reingesteckt. Eigtl wollte ich das auch irgendwie alles alleine hinbekommen, aber irgendwie bekomme ich da einfach keine funktionierende Sache bei raus ;(
    Vielen Dank für eure Hilfe! :thumbup:

  • Hi und herzlich Willkommen im Forum,


    Grundsätzlich möchte ich dich erst einmal auf einen kleinen Widerspruch hinweisen ^^


    Zitat

    Ich binde eine responsive Webside ein [...] ich möchte nämlich eine möglichst niedrigen Datenverbrauch anstreben.

    Beides wird dir wohl nicht so ganz gelingen, als wenn du die App nativ und dann nur den Content laden würdest.


    Was dein Problem angeht: Eine Implementierung findest du unter: stackoverflow.com oder sogar eine Demo unter https://github.com/henrychuangtw/WebView-Javascript-Inject


    Hoffe das hilft dir weiter ;)

    MfG,
    Christopher


    Eine gewisses Maß an Freundlichkeit kann man auch von Menschen im Internet erwarten.
    Das Forum basiert komplett auf der Freiwilligkeit ihrer Nutzer und diese sollen sich wohlfühlen! Daher seid bitte freundlich. Danke

  • Hallo,


    vielen Dank für die nette Begrüßung und den guten Tipp. Mit dem ersten komme ich leider nicht so ganz klar, ich möchte ja von einer realen Website auslesen, der Antwortsteller scheint aber ein HTML File herzunehmen und von den anderen Leuten wird sich beschwert. Ich krieg das auch nicht so ganz hin.


    Im zweiten Tipp habe ich dann folgendes gefunden: https://github.com/henrychuang…ect/blob/master/README.md .


    Sagen wir mal, ich möchte folgenden zwei Codezeilen ausführen:


    Edit: ich habs inzwischen glaub ich hinbekommen, nur führt er das Javascript immernoch nach dem Laden der Seite aus, was zu diesem unschönen zuploppen führt. Ich will vor dem laden eigtl nur folgendes ausführen:

    Java
    webView.loadUrl("javascript:(function() { " + "document.getElementsByClassName('toprow')[0].style.display= 'none'; "  + "})()");

    Der Code parallel zum vorgeschlagenen Beispiel, irgendwas muss hier doch falsch sein?:


    Ja, ich verstehe, dass sich da ein Widerspruch auftut. Ich merke, dass ich in der Richtung noch einiges zu lernen hab, ist halt doch kein Cookieclicker :D. Den habe ich noch ohne Hilfe hinbekommen, aber in dieses WebViewthema verbeiße ich mich inzwischen immer tiefer xD. Wegen des Datenverbrauches wollte ich eben wissen, wie es mit Jsoup aussieht. Von der Logik lade ich ja dann jedesmal die gesamte Seite runter, das ist doch somit das gleiche, oder?


    Wenn ich das ganze nativ implementieren wollen würde, wie müsste ich da vorgehen, dass ich Änderungen möglichst bei jedem Laden einer Seite abfange? Nativ wäre natürlich schöner, da flüssiger und (wenn ich den Content gezielt bekomme) auch weniger Verbrauch. Aber wie komme ich gezielt an den Content? Bzw. wie bekomme ich denn da z.B. sowas wie Produktbilder? Gehen wir mal aus ein Produkt hat ein Bild, einen Titel und eine Beschreibung. Ich müsste die 3 irgendwie gezielt jedesmal auslesen mit Jsoup und dann in einen ListView per Array einbinden oder wie? Wenn ich beispielsweise 50 Produkte auf einer Seite habe, dann dauert das doch auch ein bisschen, oder?


    Eine Sache will ich einbauen: Ich überlege, auf jedes OnPageFinished, die Anzahl im Warenkorb per Jsoup auszulesen und an einen Textview weiterzugeben. Wenn es wirklich nur das eine ist und ich bei der responsive WebViewMethode bleibe, sollte ich mich an die Methode mit dem HttpClient versuchen?


    Vielen Dank für deine Hilfe!

    5 Mal editiert, zuletzt von wvfragevw () aus folgendem Grund: Das ist wie in der Anleitung, aber er lädt das ganze trotzdem erst bei onPageFinished. Ich will aber, dass man dieses kurze Ploppen (das nachladen des Javascripts), garnicht sieht. Bitte helft mir :D

  • Niemand, der eine Lösung kennt? Ich möchte wie gesagt nur irgendwie schaffen, im WebView eine Website zuladen und gleichzeitig (vor dem Laden) Javascript Code ausführen. Das soll am besten so geschehen, dass der User davon nichts sieht. Danke :)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!